C++類頭文件[tdl.h]
#ifndef __TEST_DL_H__
#define __TEST_DL_H__
#include "ctdl.h"
class TestDL:public CTestDL
{
public:
TestDL(){};
virtual ~TestDL(){};
virtual void test(const char *pstr);
virtual void hello();
};
#endif
C++類源文件[tdl.cpp]
#include <stdio.h>
#include <unistd.h>
#include "tdl.h"
CTestDL *GetClass_DL(void)
{
return (new TestDL());
}
void TestDL::hello()
{
printf("hello,this is library message\n");
}
void TestDL::test(const char *pstr)
{
printf("USE library say:%s\n",pstr);
}
C++類庫外部引用文件[ctdl.h]
#ifndef __CTEST_DL_H__
#define __CTEST_DL_H__
class CTestDL
{
public:
virtual void test(const char *pstr) = 0;
virtual void hello() = 0;
};
extern "C" CTestDL *GetClass_DL(void);
#endif
編譯生成.so動態庫:
g++ -shared -lc -s -o libtdlc.so tdl.cpp
使用的時候,只需要libtdlc.so庫文件和ctdl.h頭文件
C++調用庫源文件[test.cpp]
#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>
#include "ctdl.h"
int main(int argc,char **argv)
{
CTestDL *(*pTestDLObj)(void);
dlerror();
void *lib_dl = dlopen("./libtdlc.so",RTLD_LAZY);
if(NULL == lib_dl)
{
printf("load library libtdlc.so error.\nErrmsg:%s\n",dlerror());
return -1;
}
pTestDLObj = (CTestDL *(*)(void))dlsym(lib_dl,"GetClass_DL");
const char *dlmsg = dlerror();
if(NULL != dlmsg)
{
printf("get class testdl error\nErrmsg:%s\n",dlmsg);
dlclose(lib_dl);
return -1;
}
CTestDL *pTestdl = (*pTestDLObj)();
pTestdl->hello();
pTestdl->test("success");
delete pTestdl;
dlclose(lib_dl);
return 0;
}
編譯生成應用程序:
g++ -rdynamic -ldl -s -o test test.cpp
剛開始寫動態庫的時候,TestDL類聲明里面沒寫構造和析構函數,在運行test后提示:__ZIXGnCTestDL undefine,加上之后就正常了。這個不知道是什么原因。在TestDL和CTestDL兩個類中都添加構造和析構函數,也會有這個提示。
備注:出現__XXXXClass undefine和typeinfo xxxclass / vtable xxxxclass undefine解決方法:
在定義虛函數時,virtual int test()=0;即可
