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

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


咨詢
建站咨詢
