導航:首頁 > 源碼編譯 > gcc編譯指定動態庫路徑

gcc編譯指定動態庫路徑

發布時間:2025-07-13 01:36:59

① GCC中靜態連接和動態連接的區別

gcc中靜態連接和動態鏈接的方法:

1:GCC的靜態連接,直接把靜態庫的名字放在gcc後面

例如:gcc-otesttest.cstaticlib.a


2:GCC的動態連接,使用-l指定庫,-L指定庫的路徑,注意動態庫名必須是lib開頭,後綴名為.so

例如:gcc-otesttest.c-lpthread-L/usr/lib/

3:靜態庫也可以採用動態庫的連接方法,如果目錄中同時存在2種庫,gcc會優先選擇動態庫。如果一條gcc鏈接指令中既要鏈接動態庫又要鏈接靜態庫,可以用-Wl,-dn和-Wl,-dy參數選項來切換。

靜態連接和動態鏈接的主要區別:

1:靜態連接的時候,靜態庫的所有執行代碼被直接編譯到目標程序中。而動態連接的時候,僅僅把動態庫的函數和變數的符號名,地址偏移量等導入到目標程序。只有在目標程序運行的時候才把動態庫的執行代碼載入到內存中。


2:動態鏈接的項目容易管理,把不同模塊封裝成不同的動態庫,如果模塊功能修改,一般只需要重新生成該動態庫,不用重新編譯其他模塊和目標程序。而靜態鏈接的程序修改任何一個地方都必須重新編譯整個程序


3:靜態鏈接生成的目標程序體積比動態鏈接的大,但是載入速度更快,發布更容易,不需要檢查發布機器上是否有該動態庫或者動態庫版本是否符合要求。


4:如果多個程序使用一個動態庫,則該庫的執行代碼只會在內存中載入一次。而靜態庫是多次載入(事實上靜態庫連接完就沒用了,等於目標程序的一部分)。


5:從調試的角度來說,靜態連接的程序調試方法和獨立程序沒有任何區別,而動態庫的調試相對要復雜一些,因為庫裡面的符號地址都是相對地址。

② 如何指定gcc的默認頭文件路徑

gcc指定頭文件路徑及動態鏈接庫路徑

本文詳細介紹了linux 下gcc頭文件指定方法,以及搜索路徑順序的問題。另外,還總結了,gcc動態鏈接的方法以及路徑指定,同樣也討論了搜索路徑的順序問題。本文包含了很多的例子,具有很強的操作性,希望讀者自己去走一遍。
一.#include <>與#include 「」
#include <>直接到系統指定的某些目錄中去找某些頭文件。
#include 「」先到源文件所在文件夾去找,然後再到系統指定的某些目錄中去找某些頭文件。
二.gcc指定頭文件的三種情況:
1.會在默認情況下指定到/usr/include文件夾(更深層次的是一個相對路徑,gcc可執行程序的路徑是/usr/bin/gcc,那麼它在實際工作時指定頭文件頭徑是一種相對路徑方法,換算成絕對路徑就是加上/usr/include,如#include 就是包含/usr/include/stdio.h)
2.GCC還使用了-I指定路徑的方式,即
gcc -I 頭文件所在文件夾(絕對路徑或相對路徑均可) 源文件
舉一個例子:
設當前路徑為/root/test,其結構如下:
include_test.c
include/include_test.h
有兩種方法訪問到include_test.h。
1. include_test.c中#include 「include/include_test.h」然後gcc include_test.c即可
2. include_test.c中#include 或者#include 然後gcc –I include include_test.c也可
3. 參數:-nostdinc使編譯器不再系統預設的頭文件目錄裡面找頭文件,一般和-I聯合使用,明確限定頭文件的位置。
在編譯驅動模塊時,由於非凡的需求必須強制GCC不搜索系統默認路徑,也就是不搜索/usr/include要用參數-nostdinc,還要自己用-I參數來指定內核頭文件路徑,這個時候必須在Makefile中指定。
頭文件搜索順序:
1.由參數-I指定的路徑(指定路徑有多個路徑時,按指定路徑的順序搜索)
2.然後找gcc的環境變數 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH
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/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include
三.Linux指定動態庫路徑
眾所周知,Linux動態庫的默認搜索路徑是/lib和/usr/lib。動態庫被創建後,一般都復制到這兩個目錄中。當程序執行時需要某動態庫, 並且該動態庫還未載入到內存中,則系統會自動到這兩個默認搜索路徑中去查找相應的動態庫文件,然後載入該文件到內存中,這樣程序就可以使用該動態庫中的函 數,以及該動態庫的其它資源了。在Linux 中,動態庫的搜索路徑除了默認的搜索路徑外,還可以通過以下三種方法來指定。
1.在配置文件/etc/ld.so.conf中指定動態庫搜索路徑。
可以通過編輯配置文件/etc/ld.so.conf來指定動態庫的搜索路徑,該文件中每行為一個動態庫搜索路徑。每次編輯完該文件後,都必須運行命令ldconfig使修改後的配置生效。
舉一個例子:
所有源文件:
源文件1: lib_test.c
#include
void prt()
{
printf(「You found me!!!/n」);
}
源文件2: main.c
void prt();
int main()
{
prt();
return 0;
}

③ GCC/G++選項 -Wl,-rpath=

在使用GCC/G++進行程序編譯時,可以通過-L選項指定鏈接庫的路徑。然而,該選項僅在編譯階段生效,運行時程序並不會記住鏈接庫的具體位置,導致動態載入時可能出現找不到動態庫的錯誤。

例如,當執行命令提示"error while loading shared libraries: XXX.so: cannot open shared object file: No such file or directory"時,表明程序在初始化階段無法找到相關動態庫。

為解決此問題,可以在鏈接階段使用-Wl,-rpath=選項添加庫路徑。該命令將指定路徑寫入可執行文件或庫中,從而在運行時程序可以直接讀取到。

以"/home/hello/lib"為例,運行參數-Wl,-rpath=/home/hello/lib將使程序在運行時首先搜索此目錄下的庫文件,隨後按照"/usr/lib"/"/usr/local/lib"的順序查找。可以通過ldd ./你的運行文件命令查看庫的連接情況,確保所有庫均成功連接。

總結,通過在編譯階段的tasks.json文件中設置args參數添加-Wl,-rpath=路徑,即可在運行時有效解決庫路徑問題,確保程序順利執行。

④ 關於gcc編譯選項選取動態庫不同版本的問題

不同版本的動態庫是為了升級方便,舊的程序需要與舊的庫鏈接,新的程序與新的.

一般的做法是把libabc.so連接(symbolic link, ln -s libabc.so.N libabc.so)到最新的版本,這樣以後的新程序,在用gcc -labc的時候,都會鏈接到新的版本.舊的已經鏈接好的程序並不會產生不兼容的問題,因為舊程序在過去已經鏈接過了(動態庫鏈接的信息可以用ldd來查看: ldd /bin/ls).

symbolic link, ln是推薦的維護版本的辦法,不建議更改文件名.

如果你要有一個方便的辦法鏈接舊的版本, 建一個舊的版本的symbolic link就可以了,libabc11.so
ln -s libabc.so.11 libabc11.so
gcc -labc11...

⑤ linux下編寫c++,include的那些頭文件在什麼地方

C/C++程序在linux下被編譯和連接時,GCC/G++會查找系統默認的include和link的路徑,以及自己在編譯命令中指定的路徑。

1、#include <stdio.h>,直接到系統指定目錄去查找頭文件。

系統默認路徑為:/usr/include,/usr/local/include,/usr/lib/gcc-lib/i386-Linux/2.95.2/include(gcc庫文件的路徑,各個系統不一致)

2、#include "stidio.h",會先到當前目錄查找頭文件,如果沒找到在到系統指定目錄查找。

3、gcc編譯時查找頭文件,按照以下路徑順序查找:

gcc編譯時,可以設置-I選項以指定頭文件的搜索路徑,如果指定多個路徑,則按照順序依次查找。比如,gcc -I /usr/local/include/node a.c

gcc會查找環境變數C_INCLUDE_PATH,CPLUS_INCLUDE_PATH中指定的路徑。

(5)gcc編譯指定動態庫路徑擴展閱讀:

應用程序代碼編譯過程:

編譯器根據頭文件提供的庫函數介面形式,來編譯代碼,然後生成目標文件;然後,再使用鏈接器將這個目標文件與系統庫鏈接;最終生成應用程序。代碼包含了自己寫的內容,還有系統提供好的現成的庫函數,整個結合起來才形成一個完整的程序。

庫函數的頭文件,在編譯的時候被使用,而庫函數的代碼段(庫文件),在鏈接的時候被使用。

example:

應用程序代碼在使用一個系統調用的時候,例如printf()函數,需要指定包含的頭文件stdio.h;另外,在鏈接的時候對應的鏈接libc.a(筆者電腦文件所在目錄:/usr/lib/i386-linux-gnu/libc.a)。

總結一下,編寫應用程序,需要使用linux系統提供的庫函數。具體實現起來,需要頭文件和庫文件。頭文件是需要我們編寫應用程序的時候,在源文件開頭添加的;而庫文件則需要配置編譯環境進行指定搜索目錄。

閱讀全文

與gcc編譯指定動態庫路徑相關的資料

熱點內容
百分三百的演算法 瀏覽:991
linux小米驅動 瀏覽:460
拆機怎麼看單片機好壞 瀏覽:911
一個完整的演算法應該有哪些特徵 瀏覽:515
未連接上伺服器是什麼意 瀏覽:571
如何壓縮cab 瀏覽:867
央視頻app怎麼樣投屏 瀏覽:851
陌伴app怎麼樣 瀏覽:491
軟體漢化重新編譯 瀏覽:288
甲骨文高級程序員實戰 瀏覽:958
h3c伺服器如何裝系統 瀏覽:576
冰箱壓縮機壞的現象 瀏覽:153
中望cad塊怎麼建立文件夾 瀏覽:58
noargumentjava 瀏覽:222
火車票app如何買下鋪 瀏覽:302
鳥哥的linux私房菜基礎學習篇pdf 瀏覽:710
pdf如何添加文字 瀏覽:565
福建文件加密系統怎麼選 瀏覽:693
App指紋付款在哪裡關閉 瀏覽:58
androidtextview水平居中 瀏覽:382