1. 程式人生 > >linux gcc連結選項詳解

linux gcc連結選項詳解

-I(大寫i) -L(大寫L) -l(小寫l) (1)-l -I(大寫i) 顯示指定標頭檔案的搜尋路徑。

 -I/home/myinclude/ 表示/home/myinclude目錄作為第一個尋找標頭檔案的目錄,尋找的順序是:
 /home/myinclude/ -->/usr/include -->/usr/local/include

(2) -L(大寫l) 顯示指定程式按照 -L 指定的路徑去尋找庫檔案。

-I/home/lib/ 表示/home/mylib目錄作為第一個尋找庫檔案的目錄,尋找的順序是:
/home/mylib-->
/lib-->/usr/lib-->/usr/local/lib

(3) -l(小寫) 指定在上述的lib的路徑中尋找*.so動態庫檔案

-lsqlite3 -lpthread -lcrypto ,-l後面跟著的是動態庫的名字,到上述的lib目錄尋找libsqlite3.so、pthread.so ,crypto.so動態庫檔案。

LIBRARY_PATH, LD_LIBRARY_PATH 與ld.so.conf

LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的兩個環境變數,二者的含義和作用分別如下:

LIBRARY_PATH環境變數用於在程式編譯期間查詢動態連結庫時指定查詢共享庫的路徑,例如,指定gcc編譯需要用到的動態連結庫的目錄。設定方法如下(其中,LIBDIR1和LIBDIR2為兩個庫目錄):

export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH

LD_LIBRARY_PATH環境變數用於在程式載入執行期間查詢動態連結庫時指定除了系統預設路徑之外的其他路徑,注意,LD_LIBRARY_PATH中指定的路徑會在系統預設路徑之前進行查詢。設定方法如下(其中,LIBDIR1和LIBDIR2為兩個庫目錄):

export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH

在linux下,還可以將動態連結目錄加到/etc/ld.so.conf中,在 /etc/ld.so.conf中寫下“想要讀入快取記憶體中的動態函式庫所在的目錄”,注意,是目錄而不是檔案。然後呼叫ldconfig。

動態可執行程式中不包含執行所需的所有函式,linux的動態裝入器負責裝入動態連結的可執行程式執行所需的共享庫。 動態裝入器找到共享庫要依靠兩個檔案 — /etc/ld.so.conf 和 /etc/ld.so.cache。

$ cat /etc/ld.so.conf
  /usr/X11R6/lib
  /usr/lib/gcc-lib/i686-pc-linux-gnu/2.95.3
  /usr/lib/mozilla
  /usr/lib/qt-x11-2.3.1/lib
  /usr/local/lib

ld.so.conf 檔案包含一個所有目錄(/lib 和 /usr/lib 除外,它們會自動包含在其中)的清單,動態裝入器將在其中查詢共享庫,LD_LIBRARY_PATH即是指示動態裝入器首先檢查某個目錄。但是在動態裝入器能“看到”這一資訊之前,必須將它轉換到 ld.so.cache 檔案中。可以通過執行 ldconfig 命令做到這一點: ldconfig   當 ldconfig 操作結束時,系統生成最新的 /etc/ld.so.cache 檔案,反映出 /etc/ld.so.conf 所做的更改。從這一刻起,動態裝入器在尋找共享庫時會檢視您在 /etc/ld.so.conf 中指定的所有新目錄。