天天看點

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

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,找到了一些連結參數資訊:

  

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

   其中,-l LIBNAME表示,要寫成-l libcodec_utils.so形式,而不能做一些省略,例如去掉“lib”和“.so”。(真正驗證時,還不是這種情況!!!)

  在Linux平台下,顯示一樣的資訊。可能是linux平台下,将參數"-lcodec_utils"自動補全為"-l libcodec_utils.so"形式。

6. 驗證結論

  6.1 參數形式:"-L../libs -lcodec_utils"

  

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

  6.2 參數形式:"-L../libs -l libcodec_utils.so"

  

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

   注意,錯誤提示跟6.1的稍微有些差別,系統自動添加了字首"-l"到庫名前,變成了"-llibcodec_utils.so"庫找不到。

  6.3 參數形式:"-L../libs libcodec_utils.so"

  

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

  這是在windows平台下唯一的正确的參數。

發表于

2020-11-15 01:43 

OnlyTime_唯有時光 

閱讀(0) 

評論(0) 

編輯 

收藏