mingw32環境下連結庫找不到問題
本人在win10下安裝了mingw環境,以方面windows下測試gcc編譯器建構一些開源元件。但是windows系統下遇到了一些編譯問題。
1. 問題現象
一次手寫的Makefile遇到了如下編譯錯誤:
1 $ make
2 g++ -I ../include -fPIC -c JpegDecoder.cpp -o JpegDecoder.o
3 g++ -o JpegDecoder JpegDecoder.o -L../libs -lcodec_utils
4 d:/ProgramFiles/mingw-w64/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lcodec_utils
5 collect2.exe: error: ld returned 1 exit status
6 make: *** [JpegDecoder] Error 1
可是,在linux平台上編譯這段代碼完全沒問題。。。見什麼鬼了???
2. 錯誤原因分析
直接提示表明,欲生成JpegDecoder的可執行檔案,需要連結動态庫libcodec_utils.so,但是找不到這個這個庫檔案,是以出現了這個連結錯誤提示。
3. 編譯知識回顧
一般理論常識是:-L參數指定了庫的目錄,-lxyz參數指定庫名。例如,本次連結的動态名稱為libcodec_utils.so,該庫位于上級目錄的libs檔案夾下。
4. 疑問
我再次确認,庫目錄和庫檔案都存在,Makefile寫的應該沒問題!況且在Linux平台下編譯通過了!但為什麼在win下還是報錯???
5. 答案分析
由于使用的連接配接器ld.exe是運作在window系統下的,可能跟linxu平台下的使用方法稍有差別。
windows下檢視指令行檢視:ld --help,找到了一些連結參數資訊:
其中,-l LIBNAME表示,要寫成-l libcodec_utils.so形式,而不能做一些省略,例如去掉“lib”和“.so”。(真正驗證時,還不是這種情況!!!)
在Linux平台下,顯示一樣的資訊。可能是linux平台下,将參數"-lcodec_utils"自動補全為"-l libcodec_utils.so"形式。
6. 驗證結論
6.1 參數形式:"-L../libs -lcodec_utils"
6.2 參數形式:"-L../libs -l libcodec_utils.so"
注意,錯誤提示跟6.1的稍微有些差別,系統自動添加了字首"-l"到庫名前,變成了"-llibcodec_utils.so"庫找不到。
6.3 參數形式:"-L../libs libcodec_utils.so"
這是在windows平台下唯一的正确的參數。
發表于
2020-11-15 01:43
OnlyTime_唯有時光
閱讀(0)
評論(0)
編輯
收藏