gcc中的 -I -L(大寫l) -l(小寫l) -Wl,-rpath 選項

gcc編譯程序時,可能會用到“-I”(大寫i),“-L”(大寫l),“-l”(小寫l)等參數,下面做個記錄:

例子1:

gcc -o example1 example1.c  -I /usr/local/include/freetype2 -lfreetype -lm

上面這句話在編譯example1.c 時,

-I /usr/local/include/freetype2 表示將/usr/local/include/freetype2作爲第一個尋找頭文件的目錄,參數-l  (小寫的i)。

-lfreetype  ,-l  (小寫的l)參數就是用來指定程序要鏈接的庫-l參數緊接着就是庫名。指定程序鏈接的庫名是freetype.

-lm 表示程序指定的鏈接庫名是m  (math數學庫)

 

例2:

gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld

上面這句表示在編譯hello.c時:

-I /home/hello/include表示將/home/hello/include目錄作爲第一個尋找頭文件的目錄,

尋找的順序是:/home/hello/include-->/usr/include-->/usr/local/include 

 

-L /home/hello/lib表示將/home/hello/lib目錄作爲第一個尋找庫文件的目錄,

尋找的順序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib

 

 -lworld表示在上面的lib的路徑中尋找libworld.so動態庫文件

(如果gcc編譯選項中加入了“-static”表示尋找libworld.a靜態庫文件),程序鏈接的庫名是world

例3:

使用GCC編譯動態鏈接庫的項目時,在其他目錄下執行很可以出現找不到動態鏈接庫的問題。

這種情況多發生在動態鏈接庫是自己開發的情況下,原因就是程序運行時找不到去何處加載動態鏈接庫。

可能會說在編譯時指定了鏈接的目錄啊!編譯時指定的 -L的目錄,只是在程序鏈接成可執行文件時使用的程序執行時動態鏈接庫加載不到動態鏈接庫。

j解決方法是使用-wl,-rpath=<link_path>參數,<link_path>就是鏈接庫的路徑

如: gcc -o test test.c -I/test/include -L/test/lib -ltest -Wl,-rpath=/test/lib

 

參考資料

https://blog.csdn.net/furzoom/article/details/70843664

https://www.cnblogs.com/alan666/p/8311984.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章