mingw32環境下連接庫找不到問題

本人在win10下安裝了mingw環境,以方面windows下測試gcc編譯器構建一些開源組件。可是windows系統下遇到了一些編譯問題。linux

1. 問題現象windows

  一次手寫的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平臺上編譯這段代碼徹底沒問題。。。見什麼鬼了???spa

2. 錯誤緣由分析命令行

  直接提示代表,欲生成JpegDecoder的可執行文件,須要連接動態庫libcodec_utils.so,可是找不到這個這個庫文件,所以出現了這個連接錯誤提示。3d

3. 編譯知識回顧code

  通常理論常識是:-L參數指定了庫的目錄,-lxyz參數指定庫名。例如,本次連接的動態名稱爲libcodec_utils.so,該庫位於上級目錄的libs文件夾下。blog

4. 疑問編譯器

  我再次確認,庫目錄和庫文件都存在,Makefile寫的應該沒問題!何況在Linux平臺下編譯經過了!但爲何在win下仍是報錯???it

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平臺下惟一的正確的參數。

相關文章
相關標籤/搜索