与 VS2017 和 FFMPEG 4 完全矛盾的未解决的外部符号 + 未使用的库

Posted

技术标签:

【中文标题】与 VS2017 和 FFMPEG 4 完全矛盾的未解决的外部符号 + 未使用的库【英文标题】:Contradictory unresolved external symbol + unused library altogether with VS2017 and FFMPEG 4 【发布时间】:2018-08-03 11:45:04 【问题描述】:

我在 Windows 中有一个带有 FFmpeg 4.0.2 的小型 c++ 项目。但是,我有一个奇怪的问题:我在 x64 中编译,有 x64 库,并且有正确的链接输入,但是我在链接器中同时得到了 LNK2019 error AND “未使用的库”输出/VERBOSE:

1>Unused libraries:
1>  I:\lib\ffmpeg-4.0.2-win64\lib\\avcodec.lib
1>  I:\lib\ffmpeg-4.0.2-win64\lib\\avutil.lib

我手动检查了 lib 文件是 x64。 I:\lib\ffmpeg-4.0.2-win64\lib\ 在 LIBPATH 中。

与 ICC 的症状相同。

怎么会这样?

【问题讨论】:

这可能是由于路径中的双反斜杠造成的吗? 【参考方案1】:

要在 C++ 程序中包含 ffmpeg 的标头,您必须考虑到 ffmpeg 使用 C 调用约定。否则,您的链接器将期望 C++ 名称对函数名称进行修改。但是,由于 ffmpeg 是纯 C 语言,因此您必须告诉您编译器这一点。 例如,如果您在程序中包含avformat.h,请按以下方式操作。

#ifdef __cplusplus
extern "C" 
#endif
    #include <avformat.h>
    #include <avcodec.h>
    #include <avutil.h>
#ifdef __cplusplus

#endif

其他 ffmpeg 头文件也是如此。

【讨论】:

不应该有两个#ifdef#endif,一个用于开头,一个用于结尾吗? @Scheff @solei,你说得对,应该有两个 #ifdef #endif 对。在答案中修复了这个问题。

以上是关于与 VS2017 和 FFMPEG 4 完全矛盾的未解决的外部符号 + 未使用的库的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg vs2017的一种编译方式

vs2019编译ffmpeg4.4为静态库或动态库

vs2019编译ffmpeg4.4为静态库或动态库

vs2019配置ffmpeg

Linux - ffmpeg 3.4.6 与 4.2.1 - 带有 Tee(记录和流)的 bash 脚本在旧版本中运行得很好 - 新版本需要改变啥?

FFmpeg与VS2010