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