linux makefile以及使用动态库导出c++类 和常用的一些命令

makefile的编写
makefile详细的解释的中文网站
makefile组成主要由

target ... : prerequisites ...
    command

组成 target 可以是库文件 可执行文件 以及标签 而prerequisites可以是依赖文件 而command是shell文件


FILES               = ./change.so
CFLAGS              = -g -D linux -std=c++11 -D __LINUX__
OBJECTS             = pritest.o
CREATELIB           = -shared

#动态库文件:obj文件
#编译规则是g++ -g -D linux -std=c++11 -D __LINUX__ -shared  -o ./change.so pritest.o
#shared 就是编译出动态库
$(FILES):$(OBJECTS)
	g++ $(CFLAGS) $(CREATELIB) -o $(FILES) $(OBJECTS) 
	rm -f *.o
#obj文件:源文件
#编译规则是g++ -g -D linux -std=c++11 -D __LINUX__
pritest.o:pritest.cpp
	g++ $(CFLAGS)  -fPIC -c pritest.cpp

clean:
	rm -f *.o
-lmcheck 
#这个是内存检测  待拓展

使用动态库导出c++类

.cpp文件 导出加extern "C“

#include "pritest.h"

int testSo::exporttest(int a, int b){
	return a + b;
}
testSo::testSo(){
}

testSo::~testSo(){
}



extern "C"{

	shared_ptr<void> CreateInstance(void){
			return make_shared<testSo>();
	}
	
		//释放实例对象
	void DeleteInstance(testSo * i_Object){//这个好像不需要 因为是由shared_ptr
	//进行管理 使用reset函数 计数就减去1了 不过动态库很少会释放吧
		if (i_Object != NULL)
		{
			delete i_Object;
		}
	}
}

.h文件

#include <iostream>
#include <memory>

using namespace std;
//extern "C" shared_ptr<testSo> CreateInstance(void);


class testSo{
public:
	int exporttest(int a, int b);
	testSo();
	~testSo();
};

使用

CLINKSO::DynamicLoad("./Sotest/change.so", m_lib);//这个主要使用dlopen
shared_ptr<testSo> temptestSo = static_pointer_cast<testSo>(CLINKSO::CreateDLLObject(m_lib));//这个主要使用dlsym

在这里拓展一下shared_ptr 需要包含memory头文件

采用引用计数的智能指针 无需自己手动释放内存 当引用计数为0的时候自己会释放

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值