日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux下C語言如何調(diào)用動態(tài)庫?教你簡單實現(xiàn)(linuxc調(diào)用動態(tài)庫)

動態(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