linux下C/C++編譯時系統搜索 include 和 鏈接庫 文件路徑的指定

     C/C++程序在linux下被編譯和連接時,GCC/G++會查找系統默認的include和link的路徑,以及自己在編譯命令中指定的路徑。自己指定的路徑就不說了,這裏說明一下系統自動搜索的路徑。

【1】include頭文件路徑
    除了默認的/usr/include, /usr/local/include等include路徑外,還可以通過設置環境變量來添加系統include的路徑:
    # C
    export C_INCLUDE_PATH=XXXX:$C_INCLUDE_PATH
    # CPP
    export CPLUS_INCLUDE_PATH=XXX:$CPLUS_INCLUDE_PATH
    
    以上修改可以直接命令行輸入(一次性),可以在/etc/profile中完成(對所有用戶生效),也可以在用戶home目錄下的.bashrc或.bash_profile中添加(針對某個用戶生效),修改完後重新登錄即生效。

【2】link鏈接庫文件路徑
    鏈接庫文件在連接(靜態庫和共享庫)和運行(僅限於使用共享庫的程序)時被使用,其搜索路徑是在系統中進行設置的(也可以在編譯命令中通過 -l  -L 來指定,這裏講的是使用系統默認搜索路徑)。
    一般 Linux 系統把 /lib  /usr/lib  /usr/local/lib 作爲默認的庫搜索路徑,所以使用這幾個目錄中的鏈接庫文件可直接被搜索到(不需要專門指定鏈接庫路徑)。對於默認搜索路徑之外的庫,則需要將其所在路徑添加到gcc/g++的搜索路徑之中。
    鏈接庫文件的搜索路徑指定有兩種方式:1)修改/etc/so.ld.conf   2)修改環境變量,在其中添加自己的路徑
    
    1)在環境變量中添加
    動態鏈接庫搜索路徑:
    export LD_LIBRARY_PATH=XXX:$LD_LIBRARY_PATH
    靜態鏈接庫搜索路徑:
    export LIBRARY_PATH=XXX:$LIBRARY_PATH
    以上修改可以直接命令行輸入(一次性,可以在/etc/profile中完成(對所有用戶生效),也可以在用戶home目錄下的.bashrc或.bash_profile中添加(針對某個用戶生效),修改完後重新登錄即生效。

    2)在/etc/ld.so.conf 中添加指定的鏈接庫搜索路徑(需要root權限),然後運行 /sbin/ldconfig,以達到刷新 /etc/ld.so.cache的效果。
    
    以上兩種方式均可以達到指定鏈接庫搜索路徑的效果。
    
    第二種搜索路徑的設置方式對於程序連接時的庫(包括共享庫和靜態庫) 的定位已經足夠了,但是對於使用了共享庫的程序的執行還是不夠的。這是因爲爲了加快程序執行時對共享庫的定位速度,避免使用搜索路徑查找共享庫的低效率,系統會直接讀取 /etc/ld.so.cache 並從中進行搜索的。/etc/ld.so.cache 是一個非文本的數據文件,不能直接編輯,它是根據 /etc/ld.so.conf 中設置的搜索路徑由 /sbin/ldconfig 命令將這些搜索路徑下的共享庫文件集中在一起而生成的(ldconfig 命令要以 root 權限執行)。因此,爲了保證程序執行時對庫的定位,在 /etc/ld.so.conf 中進行了庫搜索路徑的設置之後,還要運行 /sbin/ldconfig 命令,更新 /etc/ld.so.cache 文件。
    ldconfig的作用就是將/etc/ld.so.conf 指定的路徑下的庫文件緩存到/etc/ld.so.cache 。因此當安裝完一些庫文件(例如剛安裝好glib),或者修改ld.so.conf增加新的庫路徑後,需要運行一下/sbin/ldconfig 使所有的庫文件都被緩存到ld.so.cache中,不然修改的內容就等於沒有生效。
    在程序連接時,對於庫文件(靜態庫和共享庫)的搜索路徑,除了上面的設置方式之外,還可以通過 -L 和 -l 參數顯式指定。因爲用 -L 設置的路徑將被優先搜索,所以在連接的時候通常都會以這種方式直接指定要連接的庫的路徑。

注意:
    1)在配置環境變量的時候,等號前面不要加空格,否則可能出現 command not found
    2)修改/etc/ld.so.conf後,當系統重新啓動後,所有基於 GTK2 的程序在運行時都將使用新安裝的 GTK+ 庫。由於 GTK+ 版本的改變,有時會給應用程序帶來兼容性的問題,造成某些程序運行不正常。爲了避免出現這些情況,在 GTK+ 及其依賴庫的安裝過程中對於庫的搜索路徑的設置將採用環境變量的方式
    export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH


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