編譯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的區別

發佈了42 篇原創文章 · 獲贊 10 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章