主要是為了平時的學習記錄,不妥的地方,煩請指點。
一.下面主要是dlopen開啟動態庫.so相關的api介面函式。
1. void* dlopen(const char* filename,int flag);
filename 是動態庫的path路徑,flag是動態庫載入的幾種方法。
#ifndef __ctest_dl_h__
#define __ctest_dl_h__
class ctestdl
virtual ~ ctestdl()
public:
virtual void test(const char*) =0;
virtual void print()=0;
protected:
int length;
int width;
};extern "c" ctestdl* getclass(int,int); //匯出函式名
#endif
#include #include "ctest.h"
using namespace std;
class test :public ctestdl
~test(){}
public:
void test(const char*);
void print();
private:
int length ;
int width;
};
test類的cpp檔案:
#include #include #include "test.h"
using namespace std;
ctestdl* getclass(int a,int b)
void test::test(const char* data)
void test::print()
編譯的命令: g++ -shared -lc -s -o libtdlc.so test.cpp -fpic 生成動態庫libtdlc.so
測試程式:
#include #include #include #include #include "ctest.h"
using namespace std;
typedef ctestdl* (*ptestdlobj)(int,int); //定義乙個函式指標
int main(int argc,char* argv)
//ptestdlobj = (ctestdl * (*)(int,int))dlsym(lib_dl,"getclass");
ptestdlobj create_class = (ptestdlobj)dlsym(lib_dl,"getclass");
const char *dlmsg = dlerror();
if(null != dlmsg)
//ctestdl *ptestdl = ptestdlobj(2,3);
//ctestdl *ptestdl = (*ptestdlobj)();
ctestdl* tmp = create_class(3,3);
tmp->print();
tmp->test("success full !");
//ptestdl->print();
//ptestdl->test("success full ");
delete tmp;
dlclose(lib_dl);
return 0;
}
編譯: g++ main.cpp -rdynamic -ldl -s -o dl_main
程式執行的結果:
Linux環境下動態庫的呼叫
1 開啟動態鏈結庫 dlopen,函式原型為 void dlopen const char filename,int flag dlopen用於開啟指定名字 filename 的動態鏈結庫,並返回操作控制代碼。dlclose用於關閉指定控制代碼的動態鏈結庫,只有當此動態鏈結庫的使用計數為0時,才會真...
除錯linux的動態庫(動態庫的建立 呼叫 除錯)
add是庫lib.c中的函式,生成liblib.so gcc lib.c shared g debug o liblib.so 編譯呼叫庫的程式,指定庫檔案使用當前路徑 給動態庫函式add設定斷點 gdb b add 在下面提示中輸入 y function add not defined.make ...
Linux下C 動態庫
本人是剛畢業的大學生一枚,這是寫的第一篇部落格,若有不對的地方,懇請指正!由於工作原因,不得已在linux下開發專案,而且還是用c 對於c 本人是有一些白痴的。專案完成,在此做一下總結,給自己乙個交代。首先先對動態庫方面的只是做乙個總結 1 動態庫的簡單介紹 首先,動態庫就是動態鏈結庫,本人有些懶,...