【问题标题】:Linking libavformat in Visual Studio 2010在 Visual Studio 2010 中链接 libavformat
【发布时间】:2012-07-03 08:25:14
【问题描述】:

我正在尝试围绕 libavformat 构建一些视频阅读代码。在获得编译好的 DLL 和 .lib 文件 here 之后,我开始构建我的代码,即使我已经链接到提供的 .lib 文件中,链接器也找不到任何 libavformat 符号。

dumpbin -headers 检查libavformat.lib 发现它导出了带有下划线前缀的所需函数。例如,当我想调用avformat_open_input 时,.lib 文件给出了_avformat_open_input

为什么会这样,为什么我不能链接预编译的 dll?

【问题讨论】:

  • 您的应用程序也是 x64 平台吗?另请在此处复制确切的错误消息。
  • 我只是在构建一个 32 位应用程序。链接器错误只是您传统的 LibavVideoReader.obj :错误 LNK2019:未解析的外部符号“int __cdecl avformat_open_input(struct AVFormatContext * *,char const *,struct AVInputFormat *,struct AVDictionary * *)” (?avformat_open_input@@YAHPAPAUAVFormatContext@@PBDPAUAVInputFormat @@PAPAAUAVDictionary@@@Z) 在函数中引用...消息
  • 您是将代码编译为 C 还是 C++?如果是后者,您是否确保这些库中的 C 声明包含在 extern "C" 中?

标签: c++ visual-studio-2010 visual-c++ ffmpeg libavformat


【解决方案1】:

您需要完成所有任务才能使用libavMSVC++。先转到Zeranoe

  1. 下载Shared版本,从bin文件夹中复制所有.dll文件并粘贴到将生成exe的输出目录中。
  2. 下载Developer版本,从lib文件夹中复制所有.lib文件并将它们粘贴到你的主c++文件所在的位置(例如Folder-1\Folder-2其中Folder-1.sln文件所以你必须把.libFolder-2 中的文件)
  3. Developer第2步下载的版本复制include文件夹中的所有目录并将它们粘贴到Folder-2(参见第2步中Folder-2的详细信息)
  4. 下载inttypes.hstdint.h,将其保存在此位置C:\Program Files\Microsoft Visual Studio 10.0\VC\include\文件夹中。
  5. 要包含头文件,请使用以下语法

你必须使用这个extern,因为libav是一个C库。

extern "C" {
    #include "libavcodec/avcodec.h"
    #include "libavdevice/avdevice.h"
    #include "libavfilter/avfilter.h"
    #include "libavformat/avformat.h"
    #include "libavutil/avutil.h"
}

【讨论】:

    【解决方案2】:

    获取 32 位库应该没问题 :) 您的应用程序平台必须与使用的库匹配(反之亦然)。

    【讨论】:

    • 我使用的是 32 位的。否则会导致你相信什么?
    • 函数名装饰。你确定你选择了好的库吗? _ExportedNameStartingWithUnderscore 是 x64 装饰。
    • 这是一个 C/C++ 问题。将标题包装在 extern "C" { } 中可以解决所有问题。
    【解决方案3】:

    将其编译为 .lib 静态库怎么样?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多