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的时候自己会释放