VC调用FFMPEG release版出错的解决办法


vs2005 win7 下开发视频服务器, ,用到ffmpeg,debug版本运行正常,切换到release时,出现"0x00905a4d 处未处理的异常: 0xC0000005: 读取位置 0x00905a4d 时发生访问冲突",原以为是jrtplib得问题,鼓捣半天才发现是ffmpeg. 用一个很小的测试程序验证,在av_register_all处就崩溃.鸟!

难道是用mingw生成ffmpeg时有调试信息,应用程序用release编译冲突?
ffmpeg版本老旧,有这个bug?
我编译的选项不对?
测试排除了上面3个疑问. 那就只有debug和release版本的区别了. 将release的优化选项逐个的剔除测试,找到了问题所在:
连接器->优化->引用 
 
在release版本下面使用"保留未引用数据(/OPT:NOREF)"选项才可以正常运行.
 
google "ffmpeg OPT:NOREF" 发现有人已经发现并解决了这个问题.

====================转载结束分割线===========

链接器--优化--引用---保留未引用数据(/OPT:NOREF)

Configuration Properties -> Linker->Optimization 标签-->References 下面的值


微软的说明

https://msdn.microsoft.com/zh-cn/library/bxwfs976.aspx

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 选项。


你可能感兴趣的:(VC调用FFMPEG release版出错的解决办法)