// 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 常見的引數,如此一來大家應該更...