linux下的靜態鏈結和動態鏈結(一)

2021-08-20 04:10:47 字數 1374 閱讀 2858

靜態鏈結:靜態鏈結就是,在生成可執行程式的時候,把目標檔案.o 和 靜態庫 .a ,使用 ld 鏈結器,鏈結生成乙個可執行程式。這是在程式載入前就完成的動作。

靜態庫的生成:

以 lib.c為例子,**如下:

#include void foobar(int i)

使用 gcc -c lib.c 命令生成 lib.o 檔案。

再用 ar cr lib.a lib.o 來生成乙個靜態庫。

動態庫的生成:

也是以 lib.c 為例子,**如下:

#include void foobar(int i)

使用 gcc -fpic -shared -o lib.so lib.c 來生成乙個動態庫 lib.so.

當我看《程式設計師的自我修養》裡面的動態連線的介紹的時候,我在想要是靜態庫和動態庫里都有某個函式的定義,編譯的時候也同時指定這兩個靜態庫和動態庫,那麼到底會引用哪個符號呢?

驗證的**如下:lib.h

#ifndef lib_h

#define lib_h

void foobar(int i);

#endif

program.c

#include "lib.h"

int main()

第一我使用 gcc -o program program.c ./lib.so ./lib.a 來生成可執行程式 program。然後使用 nm program 檢視它的符號情況,如圖:

可以看到 foobar 的符號型別是 u (未定義),說明引用的是 lib.so 動態庫里的符號。

第二次,我使用 gcc -o program program.c ./lib.a ./lib.so 來生成可執行檔案 program, 再次使用 nm program 來檢視裡面符號的情況,如圖:

從圖中可以看到 foobar 符號的型別為 t(說明在 .text 段裡),這說明引用的是靜態庫里的 foobar 符號。

得出結論:

當編譯的時候使用的靜態庫和動態庫里都有某個符號的定義,那麼哪個在前面就引用哪個的符號定義。(其實可以執行執行程式就可以得到答案了)。

Linux下動態鏈結與靜態鏈結

一 首先我們來說一下庫的基礎概念 在windows平台和linux平台下都大量存在著庫。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。由於windows和linux的本質不同,因此二者庫的二進位制是不相容的。通俗的說就是把這些常用函式的目標檔案打包在一起,提供相應函式的介面...

linux下靜態和動態鏈結庫的生成

靜態鏈結庫 1 先將.c檔案編譯成.o檔案 例 gcc c add.c 2 用ar命令生成靜態庫 例 ar rc libadd.a add.o 3 注意 靜態庫命令規則為 lib 名字.a 4 注意使用該靜態檔案時,在編譯時,要通過 i和 l指定對應的標頭檔案和庫檔案的路徑 動態鏈結庫 1 使用命令...

靜態鏈結和動態鏈結

靜態載入dll dll工程b 專案屬性 配置屬性 常規 配置型別 動態庫 dll 在宣告檔案中,宣告匯出函式 declspec dllexport int xx 如果是c檔案,要在c 檔案中被呼叫,註明extern c 可以 ifdef cplusplus extern c endif 呼叫dll的...