Linux動(dòng)態(tài)鏈接庫(kù)編程入門(mén)
動(dòng)態(tài)鏈接庫(kù)是一種通用的軟件組件技術(shù),是多種操作系統(tǒng)中提供基本服務(wù)的方式。比如Win32內(nèi)核就是3個(gè)DLL文件構(gòu)成。這種技術(shù)在Linux操作系統(tǒng)下也有對(duì)應(yīng)的實(shí)現(xiàn),就是Linux標(biāo)準(zhǔn)對(duì)象Standard Ojbect,對(duì)應(yīng)的文件擴(kuò)展名為.so。
下面通過(guò)一個(gè)簡(jiǎn)單的例子開(kāi)始介紹Linux標(biāo)準(zhǔn)對(duì)象。
我們的標(biāo)準(zhǔn)對(duì)象文件含有一個(gè)函數(shù),不需要聲明export導(dǎo)出符號(hào),只需要編譯器設(shè)置即可。如下:
#include
#include
void show() {
printf("Standard Object by gashero\n");
}
保存為myso.c文件,按照如下編譯:
$ gcc -fPIC -shared -o libmyso.so myso.c
執(zhí)行生成一個(gè)libmyso.so文件,按照Linux標(biāo)準(zhǔn)對(duì)象的命名慣例,應(yīng)該在庫(kù)名稱(chēng)之前加上"lib"前綴,盡管不是必須的。編譯開(kāi)關(guān)-fPIC代表函數(shù)符號(hào)可以重定向,-shared代表編譯結(jié)果是一個(gè)標(biāo)準(zhǔn)對(duì)象。
不同于Win32DLL,Linux標(biāo)準(zhǔn)對(duì)象中的所有函數(shù)都是直接導(dǎo)出的,都可以被調(diào)用程序所訪(fǎng)問(wèn)。下面我們編寫(xiě)調(diào)用程序:
#include
int main() {
printf("Invoke my so\n");
show();
return 0;
}
保存為invoke.c,按照如下gcc開(kāi)關(guān)編譯:
$ gcc -o test invoke.c ./libmyso.so
編譯生成test可執(zhí)行文件。如上編譯條件的最后一條需要是所調(diào)用的標(biāo)準(zhǔn)對(duì)象文件名,注意必須含有路徑。如果只是使用libmyso.so,則必須確保這個(gè)文件在可訪(fǎng)問(wèn)的PATH下面。本例所使用的文件名"./libmyso.so"是當(dāng)前路徑下的,使用了相對(duì)路徑。
如下測(cè)試結(jié)果:
$ ./test
Invoke my so
Standard Object by gashero