Linux下包含頭文件的路徑問題與動態庫鏈接路徑問題


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中添加(針對某個用戶生效),修改完后重新登錄即生效。

1)      #include“headfile.h”

搜索順序為:

①先搜索當前目錄

②然后搜索-I指定的目錄

③再搜索gcc的環境變量CPLUS_INCLUDE_PATH(C程序使用的是C_INCLUDE_PATH)

④最后搜索gcc的內定目錄

/usr/include

/usr/local/include

/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include

 

各目錄存在相同文件時,先找到哪個使用哪個。

2)     #include<headfile.h>

①先搜索-I指定的目錄

②然后搜索gcc的環境變量CPLUS_INCLUDE_PATH

③最后搜索gcc的內定目錄

/usr/include

/usr/local/include

/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include

 

與上面的相同,各目錄存在相同文件時,先找到哪個使用哪個。這里要注意,#include<>方式不會搜索當前目錄!



【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的效果。

以上兩種方式均可以達到指定鏈接庫搜索路徑的效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM