gcc鏈結引數 whole archive的作用

2021-09-07 08:14:26 字數 1418 閱讀 6920

// a.h

extern void foo();

// a.cpp

#include 

void foo()

printf("foo\n");

// x.cpp

#include "a.h"

int main()

foo();

return 0;

// makefile

all: x

x: x.cpp liba.so

g++ -g -o $@ $^

liba.so: liba.a

g++ -g -fpic -shared -o $@ $^

#g++ -g -fpic -shared -o $@ -wl,--whole-archive $^ -wl,-no-whole-archive

liba.a: a.o

ar cru $@ $^

a.o: a.cpp

g++ -g -c $^

clean:

rm -f x a.o liba.a liba.so

$ make

g++ -g -c a.cpp

ar cru liba.a a.o

g++ -g -fpic -shared -o liba.so liba.a

#g++ -g -fpic -shared -o liba.so -wl,--whole-archive liba.a -wl,-no-whole-archive

g++ -g -o x x.cpp liba.so

/tmp/cc6uyiaf.o: in function `main':

/data/jayyi/ld/x.cpp:5: undefined reference to `foo()'

collect2: ld returned 1 exit status

make: *** [x] error 1

預設情況下,對於未使用到的符號(函式是一種符號),鏈結器不會將它們鏈結進共享庫和可執行程式。

這個時候,可以啟用鏈結引數「--whole-archive」來告訴鏈結器,將後面庫中所有符號都鏈結進來,引數「-no-whole-archive」則是重置,以避免後面庫的所有符號被鏈結進來。

// makefile

all: x

x: x.cpp liba.so

g++ -g -o $@ $^

liba.so: liba.a

g++ -g -fpic -shared -o $@ -wl,--whole-archive $^ -wl,-no-whole-archive

liba.a: a.o

ar cru $@ $^

a.o: a.cpp

g++ -g -c $^

clean:

rm -f x a.o liba.a liba.so

gcc 鏈結引數 解釋

l引數就是用來指定程式要鏈結的庫,l引數緊接著就是庫名,那麼庫名跟真正的庫檔名有什麼關係呢?就拿數學庫來說,他的庫名是m,他的庫檔名是libm.so,很容易看出,把庫檔名的頭lib和尾.so去掉就是庫名了 好了現在我們知道怎麼得到庫名,當我們自已要用到乙個第三方提供的庫名字libtest.so,那麼...

gcc鏈結階段

gcc鏈結階段 link time 此階段,告訴編譯器,在 找到庫檔案?以靜態還是動態的方式鏈結庫檔案?預設情況下使用動態方式鏈結,這要求存在對應的.so動態庫檔案,如果不存在,則尋找相應的.a靜態庫檔案。若在編譯時向gcc傳入 static選項,則使用靜態方式鏈結,這要求所有庫檔案都必須有對應的 ...

gcc 的簡易用法 編譯 引數與鏈結

gcc 的簡易用法 編譯 引數與鏈結 前面說過,gcc 為 linux 上面最標準的編譯器,這個 gcc 是由 gnu 計畫所維護的,有興趣的朋友請自行前往參考。既然 gcc 對於 linux 上的 open source是這麼樣的重要,所以底下我們就列舉幾個 gcc 常見的引數,如此一來大家應該更...