靜態鏈結:靜態鏈結就是,在生成可執行程式的時候,把目標檔案.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的...