天天看點

編譯libfdk-aac

經驗的誤區

fdk-aac項目中并沒有直接提供vs下的編譯工程,也沒有CmakeList 腳本。是以我憑經驗判斷,源碼是需要在mingw環境下編譯。正是這種直覺,簡單的判斷,直接在編譯上挖了個坑。

我用mingw很順利編譯出了libfdk-aac.a庫,結果在連結到執行程式時出錯了,錯誤如下:

(fft.o) : fatal error LNK1143: 無效或損壞的檔案: 沒有 COMDAT 0x7 節的符号
           

這個錯誤的意思是指msvc的連結器不認識fft.o這個目标檔案。一般的,mingw産生的靜态庫是可以被msvc連結的,前提是提供的C接口,并且用了extern c修飾。fdk-aac的接口風格也是如此。應該不會出現這個問題。

是以我直接蒙圈了。

解決方案

在網上找一圈,始終找不到解決方法。隻能硬着頭皮去看Makefile腳本,結果終于找到了解決方法。

fdk-aac其實提供了在windows下的一個編譯腳本Makefile.vc,使用msvc nmake去編譯即可。

再次遇到問題

在vs2015提供指令工具中直接進入fdk-aac的源碼目錄,使用如下指令進行編譯

nmake -f Makefile.vc all
           

該腳本編譯出靜态庫,動态庫,産生動态庫接口導出檔案

fdk-aac.lib
fdk-aac-1.dll
fdk-aac.dll.lib
fdk-aac.def
           

使用動态庫去連結執行程式,結果報函數找不到

找不到如下函數
aacEncOpen
aacEncClose
aacEncEncode
           

導出靜态庫的函數,發現對應的函數前都加了一個下劃線

fdk-aac.lib中的函數
_aacEncOpen
_aacEncClose
_aacEncEncode
           

那為什麼連結時找的函數跟庫提供的函數不一緻呢?

解決

原來我編譯的靜态庫是32位的,而執行程式是64位的,32位的靜态庫中C接口的name mangling是帶了下劃線的,而64位的靜态沒有下劃線

用vs2015 x86 x64指令行再次編譯即可

總結

1.檢視源代碼是否帶有windows下的編譯腳本一定,不要忽略Makefile檔案

2.要注意windows下32位,64位靜态庫的name mangling的差別

繼續閱讀