2012-07-02 56 views
2

我试图围绕打造了libavformat一些视频读取代码链接了libavformat。获得编译的DLL和.lib文件here后,我建立我的代码,链接器无法找到任何即使我在所提供的.lib文件已关联了libavformat符号。在Visual Studio 2010

检查libavformat.libdumpbin -headers显示它将带有下划线前缀的所需函数导出。例如,虽然我想呼叫avformat_open_input,但.lib文件给出了_avformat_open_input

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

+0

是您的应用x64平台呢?也请在这里复制确切的错误信息。 – hege

+0

我只是建立一个32位应用程序。链接器错误只是您的传统 LibavVideoReader.obj:错误LNK2019:无法解析的外部符号“int __cdecl avformat_open_input(struct AVFormatContext * *,char const *,struct AVInputFormat *,struct AVDictionary * *)”(?avformat_open_input @@ YAHPAPAUAVFormatContext @ @ PBDPAUAVInputFormat @@ PAPAUAVDictionary @@@ Z)在函数中引用... 消息 –

+2

您是否将代码编译为C或C++?如果是后者,你确定这些库中的C声明是否包含在'extern“C”'中? – ildjarn

回答

7

你需要做以下所有任务使用libav与。首先转到Zeranoe

  1. 下载Shared版本,从bin文件夹复制所有文件.dll并将其粘贴在exe将生成的输出目录。
  2. 下载Developer版本,从lib文件夹复制所有.lib文件,并将它们与主要的C++文件位于粘贴(如Folder-1\Folder-2Folder-1.sln文件,所以你必须把Folder-2.lib文件)
  3. Developer版本你从include文件夹在步骤2中复制下载的所有目录,并将它们粘贴到文件夹-2(见第2步中有关文件夹-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" 
} 
0

取32位库和你应该罚款:)你的应用平台必须匹配使用的库(和正相反)。

+0

我正在使用32位的。什么会导致你相信否则? –

+0

函数名称修饰。你确定你选择了好的库吗? _ExportedNameStartingWithUnderscore是x64装饰。 – hege

+0

这是一个C/C++问题。在'extern“C”{}'中包装头文件修复了一切。 –

0

把它编译成.lib静态库怎么样?