码迷,mamicode.com
首页 > 编程语言 > 详细

Linux C++动态库

时间:2014-10-17 18:31:37      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:blog   io   os   ar   使用   sp   文件   div   on   

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++动态库

标签:blog   io   os   ar   使用   sp   文件   div   on   

原文地址:http://www.cnblogs.com/yuchongjike/p/4031575.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!