最近剛剛換工作,第一次接觸到要從.so動態庫檔案裡呼叫函式。目前只得到.so庫檔案和封裝的各類函式介面。在網上搜了一些,然後根據自己的**做了整理。
首先,理解動態庫,linux中的.so檔案類似於windows中的dll,是動態鏈結庫。當多個程式使用同乙個動態鏈結庫時,既能節約可執行檔案的大小,也能減少執行時的記憶體占用。具體的如何編譯生成.so可以參照linux下gcc命令。
具體在呼叫過程中主要用到
dlopen()函式和dlsym()函式,乙個為開啟.so庫,乙個為找到需呼叫的函式。
1.根據dlopen()寫了乙個開啟函式。
st_void * open_so***()
}return p;
}st_void
、st_char就是void和char型別,因為工程需要,所以進行修改。
2.根據dlsym()寫了乙個相應的呼叫過程
st_int (*get_num)(); //需要呼叫的get_num()原型為int get_num();。另外這裡get_num命名可隨意,這裡必須要定義成指標,因為獲取的是要呼叫函式的位址。
get_num=(int(*)())dlsym(handle,"get_num"); // 這裡引數handle是dlopen()返回的指標,引數get_num是封裝在庫里的函式名,也就是你要呼叫的函式名。
int i=get_num(); //這裡就可以直接呼叫該函式了。
so動態鏈結庫生成 呼叫
linux下檔案的型別是不依賴於其字尾名的,但一般來講 o,是目標檔案,相當於windows中的.obj檔案 so 為共享庫,是shared object,用於動態連線的,和dll差不多 a為靜態庫,是好多個.o合在一起,用於靜態連線 1 動態庫的編譯 下面通過乙個例子來介紹如何生成乙個動態庫。這裡...
靜態庫 a和動態庫 so生成及呼叫
gcc編譯器工具一般位於 usr bin或者 usr local bin目錄,但它會從其它位置執行各種編譯器支援的應用程式,這個位置可能是 usr lib gcc lib 目錄,gnu c c 編譯器的各個工具和gnu專用標頭檔案都儲存在這裡。標頭檔案,一般位於 usr include,包含標頭檔案...
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...