@1 編寫和使用靜態連接庫(archive)windows
示例1.1:app
test.c: #include <stdio.h> void func(){ printf("library func\n"); } test1.c: #include <stdio.h> void func1(){ printf("library func1\n"); } app.c void main(){ func(); func1(); }
編譯test.c ,test1.c, app.c爲目標文件:函數
gcc -c test.c test1.c app.cspa
打包爲靜態庫:code
ar cr ./staticLib/libtest.a test.o test1.o進程
連接輸出到運行目標文件:io
gcc -o app app.o -L./staticLib -ltest編譯
@2 編寫和使用動態庫(shared object)table
一樣使用示例1.1中的代碼做爲示例:class
gcc -c -fPIC test1.c test.c
而後將test1.o 和test.o 輸出爲一個動態連接庫文件
gcc -shared -fPIC -o ./shareLib/libtest.so test1.o test.o
ok,以上完成後,連接到輸出目標:
gcc -o app app.o -L./shareLib -ltest -Wl,-rpath,//home/shawn/workspace/nixExample1/shareLib
-Wl後面的選項爲改變運行時ld的選項,能夠經過ld --help查看一下,該處是經過rpath選項改變executable
文件app運行時查找動態連接庫的路徑。
@3 靜態連接庫和動態連接庫的區別
最基本的區別之一是當動態連接庫被連接時,最終的可執行文件並不包含動態連接庫中的代碼。跟windows種的
可能差很少,就是在運行時將動態連接庫映射到進程地址空間中,而後修改可執行文件中某個段內的引用的函數的地址。
而靜態連接其實是將使用到的代碼靜態添加到可執行文件的代碼中,這樣的話可執行文件固然會比較大。
注: 以上純屬我的的意見,若有問題,請給與修改,謝謝。