gcc指定標頭檔案搜尋路徑及動態鏈結庫搜尋路徑

2021-10-02 06:53:20 字數 3385 閱讀 6790

#include <>直接到系統指定的某些目錄中去找某些標頭檔案。

#include ""先到原始檔所在資料夾去找,然後再到系統指定的某些目錄中去找某些標頭檔案。

1.會在預設情況下指定到/usr/include資料夾(更深層次的是乙個相對路徑,gcc可執行程式的路徑是/usr/bin/gcc,那麼它在實際工作時指定標頭檔案頭徑是一種相對路徑方法,換算成絕對路徑就是加上/usr/include,如#include就是包含/usr/include/stdio.h)

2.gcc還使用了-i(大寫的i)指定路徑的方式,即gcc -i 標頭檔案所在資料夾(絕對路徑或相對路徑均可) 原始檔

舉乙個例子:

設當前路徑為/root/test,其結構如下:

include_test.c

include/include_test.h

有兩種方法訪問到include_test.h。

include_test.c中#include 「include/include_test.h」然後gcc include_test.c即可

include_test.c中#include 或者#include 然後gcc –i include include_test.c也可

引數:-nostdinc使編譯器不再系統預設的頭檔案目錄裡面找標頭檔案,一般和-i聯合使用,明確限定標頭檔案的位置。

在編譯驅動模組時,由於非凡的需求必須強制gcc不搜尋系統預設路徑,也就是不搜尋/usr/include要用引數-nostdinc,還要自己用-i引數來指定核心標頭檔案路徑,這個時候必須在makefile中指定。

3.再找內定目錄

/usr/include

/usr/local/include

/usr/lib/gcc-lib/i386-linux/2.95.2/include

/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3

/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include

庫檔案,但是如果裝gcc的時候,是有給定的prefix的話,那麼就是

/usr/include

prefix/include

prefix/***-***-***-gnulibc/include

prefix/lib/gcc-lib/***x-***-***-gnulibc/2.8.1/include

標頭檔案搜尋順序:由引數-i指定的路徑(指定路徑有多個路徑時,按指定路徑的順序搜尋)

然後找gcc的環境變數 c_include_path, cplus_include_path, objc_include_path

ld是gcc的鏈結器

可以使用man ld來檢視gcc鏈結器手冊,其中對引數有詳細的解釋

首先要說明的是,指定動態庫的路徑其實分為兩種,第一種是編譯時,第二種是執行時。

編譯時

編譯時指定的路徑是給鏈結器使用的,我們進行鏈結的檔案可能依賴其他的函式,鏈結器在進行鏈結的時候需要搜尋到對應的函式的確實存在才能通過鏈結,否者就不能通過鏈結。某些動態鏈結庫需要我們手動的指定鏈結,某些需要我們自己指定,自定義的動態鏈結庫都是需要自己的。

用gcc的以下引數來指定

# 將namespec指定的動態鏈結檔案或目標檔案新增到要鏈結的檔案列表中

-l namespec

# 舉例,如果我們的程式中依賴了libsys.so這個動態鏈結庫,這個動態鏈結庫是我們自定義的,我們就需要像下面這樣

gcc main.c -lsys

我們指定的需要鏈結的檔案,那麼鏈結器怎麼知道你這個檔案對不對呢,或者存在不存在呢?他肯定要去驗證一下這個檔案,那他到哪去找到這個動態鏈結庫?

這就需要我們指定了,這就是編譯時指定的路徑

兩種方式

# 第一種 -l引數

-l # 第二種 環境變數 library_path

# 當然鏈結器肯定不止搜尋這兩個路徑,其肯定還存在預設路徑

對於目標檔案或者動態鏈結庫,我們可以使用ldd命令來檢視其依賴的動態鏈結庫

執行時

可以通過編輯配置檔案/etc/ld.so.conf來指定動態庫的搜尋路徑,該檔案中每行為乙個動態庫搜尋路徑。每次編輯完該檔案後,都必須執行命令ldconfig使修改後的配置生效

2.和ld_library_path

ld_library_path是程式執行期間查詢動態鏈結庫時指定除了系統預設路徑之外的其他路徑。

注意,該環境變數是全域性的,會影響所有的程式

3.編譯時設定gcc引數,設定動態鏈結庫路徑

# 這種方式是比較推薦的,只會影響這乙個程式

gcc main.c -wl,-rpath=./lib

執行時動態庫的搜尋路徑搜尋的先後順序是:1.編譯目標**時指定的動態庫搜尋路徑;

2.環境變數ld_library_path指定的動態庫搜尋路徑;

3.配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑;

4.預設的動態庫搜尋路徑/lib;

5.預設的動態庫搜尋路徑/usr/lib。

我們在生成動態鏈結庫的時候,如果我們的動態鏈結庫中依賴了其他動態鏈結庫,需要在生成該動態鏈結庫的時候,給其指定其依賴的動態鏈結庫,否者生成的該動態鏈結庫不能正常地使用。

生成動態鏈結庫與生成可執行檔案不一樣,生成可執行檔案地時候會進行符號解析,如果找不到對應地符號就會出錯,但是生成動態鏈結庫不會,所以即使我們不指定,生成的時候也不會出錯,但是使用的時候就會出錯了

新增標頭檔案搜尋路徑

gcc foo.c -i /home/xiaowp/include -o foo
新增動態庫搜尋路徑

# -l指定要鏈結的庫的名字

gcc foo.c -l /home/xiaowp/lib -l foo -o foo

新增靜態庫搜尋路徑

# -l指定要鏈結的庫的名字

gcc foo.c -l /home/xiaowp/lib -static -l foo -o foo

gcc指定標頭檔案路徑及動態鏈結庫路徑

include 直接到系統指定的某些目錄中去找某些標頭檔案。include 先到原始檔所在資料夾去找,然後再到系統指定的某些目錄中去找某些標頭檔案。1.會在預設情況下指定到 usr include資料夾 更深層次的是乙個相對路徑,gcc可執行程式的路徑是 usr bin gcc,那麼它在實際工作時指...

gcc指定標頭檔案及動態鏈結庫路徑

在利用源 進行軟體編譯的過程中,經常會出現以下錯誤 include 直接到系統指定的某些目錄中去找某些標頭檔案。include 先到原始檔所在資料夾去找,然後再到系統指定的某些目錄中去找某些標頭檔案。那麼gcc如何確定標頭檔案搜尋路徑呢?q 檔案路徑有多種,那麼先後順序如何?i 指定的路徑 gcc ...

GCC編譯時指定動態庫搜尋路徑

補充檢視編譯好的動態庫或者程序的rpath的方法 動態庫的搜尋路徑的順序 參考資料 gcc中的rpath引數可以用編譯時指定動態庫的搜尋路徑,這樣執行時就不需要export ld library path了。編譯時增加引數 wl,rpath 編譯時增加引數 wl,z,origin wl,rpath ...