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

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

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


    我是直接从http://ffmpeg.zeranoe.com/builds/网站上下好的已经编译通过的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,除非较小的代码的好处能弥补这些不足。

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 当使用ffmpeg时,如果遇到乱码问题,可以尝试修改输出流的编码方式。在使用ffmpeg的过程中,输出流使用的是错误输出,因此需要设置StandardErrorEncoding为UTF-8编码。同时,需要将RedirectStandardError设置为true,以便捕获错误输出。\[1\] 如果你遇到了类似于“‘ffmpeg’ 不是内部或外部命令,也不是可运行的程序或批处理文件。”的错误,可能是因为ffmpeg的路径有正确设置。你可以尝试修改命令中的ffmpeg路径为正确的路径。\[2\] 在修改过程中,可能会遇到中文乱码的问题。你可以尝试更换字体文件,或将字体文件拷贝到ffmpeg当前目录下解决中文乱码问题。\[3\] 另外,如果你需要在时间格式中使用冒号":",可能会导致ffmpeg报错。你可以尝试使用转义字符或采用其他方式来表示时间格式,以满足你的要求。\[3\] #### 引用[.reference_title] - *1* [【C#】【ffmpeg】外部调用线程执行ffmepg读取返回的信息乱码问题](https://blog.csdn.net/ks2686/article/details/127388879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [python多线程下载m3u8,解密并使用ffmpeg合并ts(解决命令调用ffmpeg报错乱码)](https://blog.csdn.net/weixin_42408648/article/details/119334503)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【ffmpeg遇到的问题】](https://blog.csdn.net/dzh592204/article/details/126884637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值