程式設計基礎 c 與c呼叫so檔案

2021-07-11 13:57:58 字數 2278 閱讀 7591

1、使用dlopen,實現c++的多型呼叫----

2、----

1.製作so檔案:libadd_c.so

add.c:

[cpp]view plain

copy

print?

intadd(

inta, 

intb)    

編譯:gcc -shared -fpic -lm -ldl -o libadd_c.so add.c

2.編寫測試函式

test.cpp

[cpp]view plain

copy

print?

#include 

#include 

#include 

#include 

using

namespace

std;  

intmain()  

typedef

int(*add_t)(

inta, 

intb);  

add_t add = (add_t) dlsym(handle, "add"

);  

if(!add)  

a = add(3, 4);  

printf("a = %d\n"

,a);  

dlclose(handle);  

return

0;  

}  

編譯:g++ test.cpp -ldl -o test

3.執行

./test

參考:介紹一下上面用到的介面函式

1) 

dlopen

函式原型:void *dlopen(const char *libname,int flag);

功能描述:dlopen必須在dlerror,dlsym和dlclose之前呼叫,表示要將庫裝載到記憶體,準備使用。如果要裝載的庫依賴於其它庫,必須首先裝載依賴庫。如果dlopen操作失敗,返回null值;如果庫已經被裝載過,則dlopen會返回同樣的控制代碼。

引數中的libname一般是庫的全路徑,這樣dlopen會直接裝載該檔案;如果只是指定了庫名稱,在dlopen會按照下面的機制去搜尋:

a.根據環境變數ld_library_path查詢

b.根據/etc/ld.so.cache查詢

c.查詢依次在/lib和/usr/lib目錄查詢。

flag引數表示處理未定義函式的方式,可以使用rtld_lazy或rtld_now。rtld_lazy表示暫時不去處理未定義函式,先把庫裝載到記憶體,等用到沒定義的函式再說;rtld_now表示馬上檢查是否存在未定義的函式,若存在,則dlopen以失敗告終。

2) 

dlerror

函式原型:char *dlerror(void);

功能描述:dlerror可以獲得最近一次dlopen,dlsym或dlclose操作的錯誤資訊,返回null表示無錯誤。dlerror在返回錯誤資訊的同時,也會清除錯誤資訊。

3) 

dlsym

函式原型:void *dlsym(void *handle,const char *symbol);

功能描述:在dlopen之後,庫被裝載到記憶體。dlsym可以獲得指定函式(symbol)在記憶體中的位置(指標)。如果找不到指定函式,則dlsym會返回null值。但判斷函式是否存在最好的方法是使用dlerror函式,

4) 

dlclose

函式原型:int dlclose(void *);

功能描述:將已經裝載的庫控制代碼減一,如果控制代碼減至零,則該庫會被解除安裝。如果存在析構函式,則在dlclose之後,析構函式會被呼叫。

好了,現在來編譯打包,命令如下:

$ g++ -shared -fpic -o libhello.so hello.cpp

$ g++ main.cpp -ldl

在上面dlopen函式中,看到我們傳的第乙個引數並沒有指定路徑,只給出了庫的名稱。那是因為已經在環境變數ld_library_path中指定了 ./ 目錄,如下圖所示。

如果你想放在其他目錄,修改該環境變數即可。

c 生成so呼叫LOGI

前一陣為android程式寫了一些c 生成的so檔案,但是單檔案沒法單步除錯,導致呼叫時出現問題後不好定位 於是想到在c 程式的關鍵點打logi標記,剛開始遇到些問題,後來終於解決了,現在把解決方法記錄下來,方便自己,也方便別人。首先,在c 或c的開始定義巨集,如下 定義info資訊 define ...

linux下將c 編譯成so,呼叫該so檔案

在其他資料上增加了過程中遇到的問題。so檔案為動態鏈結庫檔案,與windows下的dll檔案相當,linux下系統so檔案一般儲存在 usr lib中。下面就說明一下如何生成c 程式的so檔案,以及如何在c 程式中呼叫該so檔案 test.h ifdef cplusplus extern c int...

c 呼叫c 的so動態庫2

1.環境 ubuntu 14.04 g 4.8.4 2.有類的情況 1 庫檔案 a 原始碼 class cal typedef cal creat t typedef void destroy t cal include cppl2.h cal cal cal cal int cal add int...