Linux C語言交叉開發,動態庫編譯

2021-10-11 08:38:11 字數 2740 閱讀 8915

.c和.**件。此處以find_max.c find_max.h sort_arry.c sort_arry.h為例

2、分別將兩個不同功能檔案分別編譯為動態庫檔案

(1)cc -shared -fpic -o libfindmax.so find_max.c

(2)cc -shared -fpic -o libsortarry.so sort_arry.c

-shared:說明編譯為共享庫(動態庫)

-fpic:於位置無關的

-o:編譯為指定檔案

libfindmax.so/ libsortarry.so:目標檔案

find_max.c/ sort_arry.c:原始檔

3、在main函式中呼叫兩個庫檔案

(1)cc main.c //編譯主函式檔案

這是找不到標頭檔案,「 」 引起來的標頭檔案只會在當前目錄查詢

解決方法:

指定標頭檔案的路徑

-i   include

-i接乙個目錄名,指定標頭檔案查詢路徑,可以是相當路徑也可以是決定路徑,可以接多個-i

-i後面不需要空格

你的工程包含標頭檔案時,一般需要指定這些標頭檔案的路徑,不然編譯器找不到

編譯器還會去系統標頭檔案路徑查詢

(2)、採用 cc main.c -iinc我將函式標頭檔案find_max.h sort_arry.h放在inc目錄下

但是又出現了如下狀況:

原因是找到了這個函式的宣告,但是找不到這個函式的實現

解決方法:

加庫檔案

-l(lib)

你的工程原始檔中使用了其他模組提供的函式的時候你必須告訴編譯器你

的函式的定義在**

printf/scanf這兩個函式,我沒有指定函式在**實現的,也可以使用呢?

因為這是c語言的標準庫,編譯器會自動的包含這個標準庫

總之,一句話,你使用不是你自己定義的函式/庫函式,就必須指定出處

一般是指定包含該函式的庫檔案

-l庫的名字(去掉前面的lib和後面的.so)

-llibfindmax.so ----->-lfindmax

如:程式中使用數學函式的時候 -lm libm.so

一定要把定義時的lib和.so去掉不然就會出現下面這種狀況

(3)正確版本:cc main.c -iinc -lfindmax -lsortarry

執行上述程式之後又會出現下面的問題:

/usr/bin/ld: 找不到 -lfindmax -lsortarry

collect2: error: ld returned 1 exit status

編譯器找不到名字叫做findmax sortarry的庫檔案,因為編譯器預設只會去標準庫(/lib:/usr/lib…)的目錄中找庫檔案

解決方法:

-l指定庫的搜尋路徑

-l接乙個庫的搜尋路徑

-llib:在當前目錄下的lib目錄下去查詢庫,-l後面也不需要空格,可以接多個-l

(4)cc main.c -iinc -lfindmax -lsortarry -llib

最後這一步就不會報警告了

(5)當我開始執行a.out檔案的時候警告又出現了!

這是由於我沒有把動態庫載入到記憶體中去,執行a.out是時候它在記憶體中沒找到我的libfindmax.so

動態庫你必須記住的特定:

某乙個工程編譯的時候用到了某乙個動態庫中的函式,但是在編譯完成後,並不會把用到的動態庫的內容鏈結到可執行檔案中去(a.out並沒有具體函式的實現方法),僅僅是做了乙個標記,表示在某乙個地方用到了某某庫

ldd a.out //檢查a.out用到的庫檔案

後面括號裡面的表示庫檔案相對於a.out在記憶體中的位址。由此可知確實.so庫檔案確實沒在記憶體中

解決方法:

在執行的程式的時候,可以指定庫的載入路徑,linux中有乙個環境變數

ld_library_path load library path 載入庫的路徑

$環境變數 表示環境變數的值

四種方法設定環境變數:

1.臨時性的 export 環境變數=$環境變數:你要新增的路徑

//只對當前終端有效,關閉終端還得重新設定

2.寫入/etc/profile

3.寫入到家目錄的.bashrc

4.寫入到/etc/environment中

我這裡採用第一種方法,只是做的乙個簡單的練練手,不想讓他一直在記憶體中跑。

這時候程式就能完美的跑起來了!!!

linux下的C語言開發(動態庫)

摘自 動態鏈結庫不是linux獨有的特性,在windows下面也存在這樣的特性。一般來說,windows下面的動態連線庫是以 dll作為結尾的,而linux下面的動態連線庫是以 so結尾的。和靜態鏈結庫相比,動態連線庫可以共享記憶體資源,這樣可以減少記憶體消耗。另外,動態連線是需要經過作業系統載入器...

linux下的C語言開發(動態庫)

動態鏈結庫不是linux獨有的特性,在windows下面也存在這樣的特性。一般來說,windows下面的動態連線庫是以 dll作為結尾的,而linux下面的動態連線庫是以 so結尾的。和靜態鏈結庫相比,動態連線庫可以共享記憶體資源,這樣可以減少記憶體消耗。另外,動態連線是需要經過作業系統載入器的幫助...

linux下的C語言開發(動態庫)

動態鏈結庫不是linux獨有的特性,在windows下面也存在這樣的特性。一般來說,windows下面的動態連線庫是以 dll作為結尾的,而linux下面的動態連線庫是 以 so結尾的 和靜態鏈結庫相比,動態連線庫可以共享記憶體資源,這樣可以減少記憶體消耗 另外,動態連線是需要經過作業系統載入器的幫...