一次gcc鏈結靜態庫的小實驗總結

2021-09-18 07:50:43 字數 1323 閱讀 2136

首先,大致說一下**檔案結構,具體**附在最後。

main.c裡面呼叫libtesta.a(testa.c)裡面的函式testa()和libtestb.a(testb.c)裡面的函式testb(),函式testa()和testb()分別呼叫了libbase.a(base.c)裡面的函式funca()和函式funcb()。

1. gcc main.o -l./ -lbase -l./ -ltesta -l./ -ltestb

報錯如下:testa()和testb()中使用的funca()和funcb()未定義。

鏈結成功,使用'nm'命令檢視目標檔案,會看到ibbase.a裡面沒有使用到的funcc()也被載入到目標檔案裡面了。

#結論:即使只使用到靜態庫中的部分函式,靜態庫也會被全量載入至目標檔案中。

4. 去掉main.c中的testa()函式呼叫,執行:gcc main.o -l./ -ltesta -l./ -ltestb -l./ -lbase

鏈結成功,使用『nm』命令檢視目標檔案,函式testa()並沒有載入到目標檔案中。

#include "testa.h"

#include "testb.h"

int main()

void testa();

#include "base.h"

void testa()

void testb();

#include "base.h"

int testb()

void funca();

void funcb();

void funcc();

#include "base.h"

#include void funca()

void funcb()

void funcc()

gcc中動態庫和靜態庫的鏈結順序

so檔案 動態庫 a檔案 靜態庫 exe檔案 可執行程式 linux下以檔案屬性來標示是否是可執行檔案,與字尾名無關 1,動態庫中可以包含另乙個靜態庫,通過引數 l 把靜態庫lib a加入so檔案中,這樣so檔案中 就包含了lib a的所有實現。當然,如果不包含lib a也沒有問題,這樣生成的so會...

gcc中動態庫和靜態庫的鏈結順序

so檔案 動態庫 a檔案 靜態庫 exe檔案 可執行程式 linux下以檔案屬性來標示是否是可執行檔案,與字尾名無關 1,動態庫中可以包含另乙個靜態庫,通過引數 l 把靜態庫lib a加入so檔案中,這樣so檔案中 就包含了lib a的所有實現。當然,如果不包含lib a也沒有問題,這樣生成的so會...

gcc中動態庫和靜態庫的鏈結順序

so檔案 動態庫 a檔案 靜態庫 exe檔案 可執行程式 linux下以檔案屬性來標示是否是可執行檔案,與字尾名無關 經過自己寫的一些測試程式,大致了解了下gcc中鏈結順序問題,總結出以下幾點 1,動態庫中可以包含另乙個靜態庫,通過引數 l 把靜態庫lib a加入so檔案中,這樣so檔案中 就包含了...