FFMPEG编码debug模式没问题,release模式报错

FFMPEG编码debug模式没问题,release模式报错

我在做“火灾监控预警软件”时编译工程,需要使用ffmpeg对H264码流解码。发现在用到ffmpeg debug版本运行正常,切换到release时,出现“无法定位程序输入点?。。。于动态链接库avcodec-56.dll”。

我是直接从网站上下好的已经编译通过的dll。当时我就怀疑dll只是debug模式下编译的,而非release版本。

但我下载的文件中并没有区分debug与release版本的dll。

所幸查找关键词“ffmpeg release 错误 动态链接库无法”,发现了解决方案:

只要修改工程属性可以解决这个问题。首先打开工程属性,找到链接项目,在优化中有个引用项,选择保留未引用数据(/OPT:NOREF)即可,我的工程是英文版,截图如下:

在MSDN上查找/OPT(优化)相关信息

REF|NOREF

/OPT:REF清除从未引用的函数和数据;

/OPT:NOREF保留从未引用的函数和数据。

当启用 /OFT:REF时,LINK会移除未引用的已打包函数和数据。如果对象已经用/Gy选项编译过,它将包含打包的函数和数据 (COMDAT)。此优化称为可传递的 COMDAT 消除。默认情况下,在非调试生成中启用/OPT:REF。若要重写此默认值并在程序中保留未引用的 COMDAT,请指定/OPT:NOREF。可以使用/INCLUDE选项重写特定符号的移除。

在显式或默认启用/OPT:REF后,将启用受限形式的/OPT:ICF(仅会折叠相同的函数)。如果需要/OPT:REF而不是/OPT:ICF,则必须指定/OPT:REF,NOICF或/OPT:NOICF。

如果指定了/DEBUG,则/OPT的默认项是NOREF,而且所有函数都保留在映像中。若要重写此默认项并优化调试生成,请指定/OPT:REF。由于/OPT:REF隐式使用/OPT:ICF,建议你同时指定/OPT:NOICF以在调试生成中保留相同的函数。这样更容易读取堆栈跟踪以及在本应折叠在一起的函数中设置断点。/OPT:REF选项禁用增量链接。

你必须将const数据显式标记为 COMDAT;使用__declspec(selectany)。

指定/OPT:ICF不启用/OPT:REF选项。

ICF[=iterations]| NOICF

使用/OPT:ICF[=iterations]执行相同的 COMDAT 折叠。可以从链接器输出中删除冗余 COMDAT。可选iterations参数指定遍历符号以查找重复项的次数。默认迭代次数是两次。附加的迭代可以找到更多前一次迭代中未通过折叠发现的重复项。

指定/OPT:REF并且ICF默认为有效时的链接器行为方式与显式指定/OPT:REF,ICF时的行为方式不同。单独使用/OPT:REF启用的ICF的窗体不折叠只读数据(包括 .rdata、.pdata 和 .xdata)。因此,为 x64 生成映像时将折叠较少的函数,因为这些模块中的函数更依赖于只读数据(例如.pdata 和 .xdata)。若要获取完整的ICF折叠行为,请显式指定/OPT:ICF。

若要在 COMDAT中放置函数,请使用/Gy编译器选项;若要放置const数据,请将其声明为__declspec(selectany)。有关如何指定用于折叠的数据的详细信息,请参阅selectany。

默认情况下,如果REF处于打开状态,则ICF处于打开状态。若要重写此默认值,当指定REF时,请使用NOICF。当未在调试生成中指定/OPT:ICF时,你必须显式指定/OPT:REF以启用 COMDAT 折叠。但是,,由于/OPT:ICF能合并相同的数据或函数,因此它也能更改显示在堆栈跟踪中的函数名。它还能使你无法在某些函数中设置断点或在调试器中检查某些数据,并让你在单步执行代码时进入意外的函数。因此,建议不在调试生成中使用/OPT:ICF,除非较小的代码的好处能弥补这些不足。

我喜欢旅游,喜欢离开自己过腻歪的城市,

FFMPEG编码debug模式没问题,release模式报错

相关文章:

你感兴趣的文章:

标签云: