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...