gcc編譯程序時,可能會用到“-I”(大寫i),“-L”(大寫l),“-l”(小寫l)等參數,下面做個記錄:
例子1:
gcc -o example1 example1.c -I /usr/local/include/freetype2 -lfreetype -lm
-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
參考資料