首页 > 代码库 > Linux C++动态库
Linux C++动态库
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 -ld -s -o test test.cpp
刚开始写动态库的时候,TestDL类声明里面没写构造和析构函数,在运行test后提示:__ZIXGnCTestDL undefine,加上之后就正常了。这个不知道是什么原因。在TestDL和CTestDL两个类中都添加构造和析构函数,也会有这个提示。
Linux C++动态库
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。