經驗的誤區
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的區別