I wanted to build a debug build of ffmpeg using Visual C++ today, one without any optimizations. This implies the use of the -Od compiler option. Unfortunately, I quickly discovered that the build fails soon after it starts because it can't find certain architecture-specific references. For example, in libavutil/cpu.c, there is the following:

    if (ARCH_AARCH64)
        return ff_get_cpu_flags_aarch64();

The linker couldn't find ff_get_cpu_flags_aarch64 (and other similar references) and failed. This isn't an issue when optimizations are turned on because the compiler notices that ARCH_AARCH64 is defined as 0 and eliminates the relevant code.

Effectively, successful builds of ffmpeg depend on this compiler optimization. This appears to have been the standard practice in the ffmpeg code base for at least the last few years, but it is unclear to me why this approach is being used, since, in addition to depending on specific compiler behavior, it prevents fully debug builds from succeeding, at least with Visual C++.

If people like the if (ARCH_...) syntax, while it wouldn't look quite as nice, what's wrong with doing the following:

#if ARCH_AARCH64
    if (ARCH_AARCH64)
        return ff_get_cpu_flags_aarch64();
#endif

Another, much less desirable option is to use #pragma optimize for the relevant functions in ffmpeg to turn optimizations on for specific functions.

A third option would be to build only the relevant files with optimizations turned on, but this will end up making the Makefiles more complicated, and the relative simplicity of the Makefiles is appealing.

For now, I'm using both -Od and -Og with Visual C++ (-Og turns on some optimizations, but not as much as -O1 or -O2), but this isn't the same as a true debug build.

Thanks,
Aaron Levinson
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to