(一)編寫和使用靜態及動態連接庫

@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種的

可能差很少,就是在運行時將動態連接庫映射到進程地址空間中,而後修改可執行文件中某個段內的引用的函數的地址。

而靜態連接其實是將使用到的代碼靜態添加到可執行文件的代碼中,這樣的話可執行文件固然會比較大。

注: 以上純屬我的的意見,若有問題,請給與修改,謝謝。      

相關文章
相關標籤/搜索