首先,大致說一下**檔案結構,具體**附在最後。
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檔案中 就包含了...