2012-07-02 302 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靜態庫怎麼樣?