不使用编译器优化进行FFMPEG编译

5
我正在使用Microsoft cl编译器为win32编译ffmpeg。我需要编译它而不进行任何优化,所以添加了configure --extra-cflags= -Od"。
编译过程很顺利,但有一些地方像这个一样:
最后3个if语句。
代码可以编译,但由于类似ff_sbrdsp_init_arm(s);的调用未被编译器删除,因此无法链接。当然,在进行优化时一切都正常。然后编译器会删除所有if(0)。
在ffmpeg中有几个类似的地方。为什么要使用if(0),而不是预处理器的#if 0?
这背后有什么隐藏的技巧吗?
2个回答

3
< p>使用if (0) C;而不是用#if或者#ifdef的一个优点是代码仍然可以被编译器进行类型检查。如果调用C中的某个函数的原型发生更改,即使进行编译的人没有使用这个配置,编译器也会警告调用点需要进行调整。

对于您在使用不删除这些无用调用的编译平台时遇到的实际问题,您可以安全地将它们更改为预处理器版本(*)。但是,也许您应该解释一下为什么必须进行没有优化的编译。也许可以启用只删除这种死代码的优化,这是允许并且可能的。

(*) 这里我巧妙地避免了具体推荐#if ARCH_ARM#ifdef ARCH_ARM,但这对您并不公平。请注意它们是不同的。如果ARCH_ARM始终被定义为01,则使用#if ARCH_ARM。如果它被定义或未定义,则使用#ifdef。如果宏旨在在if(…)中工作,则是前一种情况。


是的,如果我知道如何打开仅删除死代码但不进行其他优化的优化开关,那就好了... 顺便说一下,我需要它来调试 - 在调试器中逐步执行。 - Kamil_H
@Kamil_H 要自动处理替换可能会很困难,但你至少可以使用正则表达式 if ([A-Z_]*) 来查找所有可能需要修改的站点(这将查找所有仅由大写字母和下划线组成的 if 条件)。 - Pascal Cuoq
好的,谢谢建议,但我的问题略有不同:这些if是否有任何原因。似乎有人是故意这样做的。 - Kamil_H
@Kamil_H 我认为唯一的原因就是,由于有很多开发人员,需要避免不是每个人都编译相同的预处理源并看到相同的警告。在一个层次结构较小且有许多开发人员的环境中,如果其他人意外破坏了你的东西,因为他们没有编译它,那么很快就会变得令人疲倦。 - Pascal Cuoq

0

实际的ffmpeg设计:

if (ARCH_ALPHA)
  ff_me_cmp_init_alpha(c, avctx);
if (ARCH_ARM)
  ff_me_cmp_init_arm(c, avctx);
if (ARCH_PPC)
  ff_me_cmp_init_ppc(c, avctx);
if (ARCH_X86)
  ff_me_cmp_init_x86(c, avctx);
if (ARCH_MIPS)
  ff_me_cmp_init_mips(c, avctx);

良好的简单设计:

#if USE_INLINE_ASM
  if (ARCH_ALPHA)
    ff_me_cmp_init_alpha(c, avctx);
  if (ARCH_ARM)
    ff_me_cmp_init_arm(c, avctx);
  if (ARCH_PPC)
    ff_me_cmp_init_ppc(c, avctx);
  if (ARCH_X86)
    ff_me_cmp_init_x86(c, avctx);
  if (ARCH_MIPS)
    ff_me_cmp_init_mips(c, avctx);
#endif

良好的扩展设计:

#if (ARCH_ALPHA)
    ff_me_cmp_init_alpha(c, avctx);
#elif (ARCH_ARM)
    ff_me_cmp_init_arm(c, avctx);
#elif (ARCH_PPC)
    ff_me_cmp_init_ppc(c, avctx);
#elif (ARCH_X86)
    ff_me_cmp_init_x86(c, avctx);
#elif (ARCH_MIPS)
    ff_me_cmp_init_mips(c, avctx);
#endif

为什么FFmpeg不使用好的简单/扩展设计是个谜...

如果有人同时将ARCH_ALPHA和ARCH_ARM定义为1,这是没有意义的,但代码将会在VS下编译(具有奇怪的行为)。

说:

if (0) C;比#if或#ifdef解决方案的一个优点是代码仍然经过类型检查

对于使用VS编译的FFmpeg来说只是愚蠢的。如果你不需要ALPHA/ARM/PPC/X86/MIPS/...,为什么还要编译它呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接