新聞中心
動(dòng)態(tài)庫(kù)是Linux下常用的一種共享庫(kù),與靜態(tài)庫(kù)不同,它在程序運(yùn)行時(shí)才會(huì)被載入內(nèi)存,并在程序退出時(shí)卸載,因此相比靜態(tài)庫(kù)可以節(jié)省內(nèi)存空間。動(dòng)態(tài)庫(kù)有很多種類型,例如共享目標(biāo)文件(.so)和動(dòng)態(tài)鏈接庫(kù)(.dll)等。C語(yǔ)言支持通過(guò)調(diào)用動(dòng)態(tài)庫(kù)中的函數(shù)來(lái)實(shí)現(xiàn)代碼重用,本文將簡(jiǎn)單介紹如何在Linux下使用C語(yǔ)言調(diào)用動(dòng)態(tài)庫(kù)。

一、動(dòng)態(tài)庫(kù)的創(chuàng)建
在Linux下創(chuàng)建動(dòng)態(tài)庫(kù)的方法如下:
$ gcc -shared -o libtest.so test.c
其中,-shared指示編譯器生成一個(gè)共享目標(biāo)文件,-o指示輸出文件名為libtest.so,test.c為源碼文件名。
二、C語(yǔ)言調(diào)用動(dòng)態(tài)庫(kù)
為了調(diào)用動(dòng)態(tài)庫(kù)中的函數(shù),需要在C程序中聲明函數(shù)的原型,并使用dlopen()、dlsym()和dlclose()等系統(tǒng)調(diào)用來(lái)打開(kāi)、查找和關(guān)閉動(dòng)態(tài)庫(kù)。
首先聲明函數(shù)原型,例如test.c中定義了一個(gè)名為test()的函數(shù):
“`c
#include
void test()
{
printf(“Hello, World!\n”);
}
“`
然后,在調(diào)用test()函數(shù)之前,需要使用dlopen()函數(shù)來(lái)打開(kāi)動(dòng)態(tài)庫(kù),并將其句柄存儲(chǔ)在一個(gè)void類型的指針中:
“`c
#include
int mn()
{
void* handle = dlopen(“./libtest.so”, RTLD_LAZY);
if (!handle)
{
printf(“%s\n”, dlerror());
return 1;
}
typedef void (*func_t)();
func_t func = (func_t)dlsym(handle, “test”);
if (!func)
{
printf(“%s\n”, dlerror());
return 1;
}
func();
dlclose(handle);
return 0;
}
“`
在上述代碼中,我們首先使用dlopen()函數(shù)打開(kāi)了名為libtest.so的動(dòng)態(tài)庫(kù),如果打開(kāi)失敗則輸出錯(cuò)誤信息,并退出程序。然后,使用dlsym()函數(shù)查找名為test的函數(shù),并將其轉(zhuǎn)換為一個(gè)函數(shù)指針,最后通過(guò)函數(shù)指針調(diào)用test()函數(shù)。需要注意的是,dlsym()函數(shù)會(huì)返回一個(gè)void指針,需要將其顯式轉(zhuǎn)換為正確的函數(shù)指針類型。使用dlclose()函數(shù)關(guān)閉動(dòng)態(tài)庫(kù)句柄。
三、完整示例代碼
test.c:
“`c
#include
void test()
{
printf(“Hello, World!\n”);
}
“`
mn.c:
“`c
#include
#include
int mn()
{
void* handle = dlopen(“./libtest.so”, RTLD_LAZY);
if (!handle)
{
printf(“%s\n”, dlerror());
return 1;
}
typedef void (*func_t)();
func_t func = (func_t)dlsym(handle, “test”);
if (!func)
{
printf(“%s\n”, dlerror());
return 1;
}
func();
dlclose(handle);
return 0;
}
“`
編譯:
$ gcc -shared -o libtest.so test.c
$ gcc -o mn mn.c -ldl
運(yùn)行:
$ ./mn
Hello, World!
四、
相關(guān)問(wèn)題拓展閱讀:
- linuxopencv生成的靜態(tài)或動(dòng)態(tài)庫(kù)怎樣在調(diào)用的時(shí)候不用安裝openvcv環(huán)境
- linux調(diào)用動(dòng)態(tài)庫(kù)彈出界面
- 關(guān)于linux下連接動(dòng)態(tài)庫(kù)問(wèn)題
linuxopencv生成的靜態(tài)或動(dòng)態(tài)庫(kù)怎樣在調(diào)用的時(shí)候不用安裝openvcv環(huán)境
使用cmake編譯opencv靜態(tài)鏈接庫(kù)(靜態(tài)庫(kù)),配置環(huán)境變量(動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)一樣),復(fù)制dll文件。
將這三個(gè)dll分別復(fù)制到C:\Windows\System32和C:\Windows\SysWOW64目錄下。
配置包含目錄升悄運(yùn):視圖->其它窗口->屬性管理器。運(yùn)李配置庫(kù)目錄然吵梁后配置附加依賴項(xiàng)。
linux調(diào)用動(dòng)態(tài)庫(kù)彈出界面
您想問(wèn)的是動(dòng)態(tài)庫(kù)的罩搜顯式調(diào)用吧。
首先打開(kāi)一個(gè)新庫(kù),并把它裝入內(nèi)存。如搜
dlopen在dlfcn.h中定義,并在dl庫(kù)中實(shí)現(xiàn)。
當(dāng)庫(kù)被裝入后,可以把dlopen返回的句柄作為給dlsym的之一個(gè)參數(shù),以渣悶歷獲得符號(hào)在庫(kù)中的地址。
關(guān)于linux下連接動(dòng)態(tài)庫(kù)問(wèn)題
/etc/ld.so.conf 里或者環(huán)境高閉變山搜量里添加庫(kù)路徑,或者要戚唯裂把文件放到/usr/lib這樣的路徑里面,再更新一下ld.so.conf文件
gcc編譯時(shí),當(dāng)使用動(dòng)態(tài)庫(kù)編譯可以按照幾種寫法
1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的編譯參數(shù)都是按照2或3去寫
2寫法的含義是從/lib或者/usr/lib目錄下尋找名稱為SDL2-2的庫(kù),即尋找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件進(jìn)行鏈接,當(dāng)然如果沒(méi)有動(dòng)態(tài)庫(kù)升咐就會(huì)去找靜態(tài)庫(kù),再?zèng)]有應(yīng)該就會(huì)在編譯時(shí)報(bào)錯(cuò)
3寫法的含義是從-L參數(shù)首先從指定的目錄中尋找需要鏈接的庫(kù)文件,隨后再去尋找系統(tǒng)文件夾中是否存在需要的庫(kù)
1寫法的含義是將當(dāng)前目錄下的./libSDL2-2.so.0文件鏈接進(jìn)最終文件,因此執(zhí)行readelf -a a.out后在動(dòng)態(tài)庫(kù)部分所看到的路徑就是./libSDL2-2.so.0,進(jìn)而在執(zhí)行文件時(shí)僅會(huì)從當(dāng)前目錄下尋找libSDL2-2.so.0文件,當(dāng)執(zhí)行文件時(shí)所在的目錄下沒(méi)有該文件時(shí)就會(huì)出現(xiàn)找不到庫(kù)文件的操作吵困純
你第二次操作時(shí),因?yàn)閒unction.so庫(kù)文件與a.out文件在同一個(gè)目錄,同時(shí)也是在該目錄下執(zhí)行的ldd操作及運(yùn)行a.out,a.out在加載動(dòng)態(tài)庫(kù)時(shí)從當(dāng)前目錄下找到了所需要的庫(kù)文件,此時(shí)能夠執(zhí)行成功(ldd命令實(shí)質(zhì)是一個(gè)腳本,通過(guò)設(shè)置環(huán)境變量運(yùn)行動(dòng)態(tài)庫(kù)鏈接器來(lái)輸出所有待鏈接的動(dòng)態(tài)庫(kù))。
你可以試試將a.out拷貝至其他目錄再次運(yùn)行,將出現(xiàn)和之一次操作時(shí)一樣的現(xiàn)象,找不到function.so文件。
具體的解決方法就是修改編譯參數(shù),將./libSDL2-2.so.0修改為-lSDL2-2并將libSDL2-2.so.0文件拷貝至/usr/lib目錄下,并且可能因?yàn)闆](méi)有修改鏈接器的緩存文件(將可能找不到帶版本號(hào)后綴的動(dòng)態(tài)庫(kù)),需要在/usr/lib目錄下建立一個(gè)文件連接(ln -s libSDL2-2.so.0 libSDL2-2.so)或尺游者直接修改名稱為libSDL2-2.so
很橋野奇怪的游消塵gcc用法, 鏈接庫(kù)的時(shí)候你應(yīng)該神禪使用選項(xiàng)”-l”來(lái)指定, 而不是像個(gè)c文件一樣直接寫在后面.
關(guān)于linux c調(diào)用動(dòng)態(tài)庫(kù)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開(kāi)發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)——四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,高電服務(wù)器托管,算力服務(wù)器租用,可選線路電信、移動(dòng)、聯(lián)通機(jī)房等。
網(wǎng)站題目:Linux下C語(yǔ)言如何調(diào)用動(dòng)態(tài)庫(kù)?教你簡(jiǎn)單實(shí)現(xiàn)(linuxc調(diào)用動(dòng)態(tài)庫(kù))
網(wǎng)頁(yè)鏈接:http://m.fisionsoft.com.cn/article/cdohejc.html


咨詢
建站咨詢
