so文件为动态链接库文件,与windows下的dll文件相当,linux下系统so文件一般保存在/usr/lib中。
下面就说明一下如何生成c++程序的so文件,以及如何在c++程序中调用该so文件
==========test.h===========
#ifdef __cplusplus //
extern "C"
{
#endif
class Test{
public:
int hello(int i);
};
int helloT(int j);
#ifdef __cplusplus
}
#endif
==========test.cpp===========
#include"test.h"
#include
using namespace std;
int Test::hello(int i){
if(i>3)
cout<3"<
else
cout<
return 0;
}
int helloT(int j){
Test *t=new Test();
t->hello(j);
return 0;
}
编译test.cpp文件
g++ -shared -fpic -lm -ldl -o libtest.so test.cpp
其中,so文件名必须以lib开头。编译具体指令请参考帮助文档
==========main.cpp===========
#include
#include
#include
#include
using namespace std;
/*
需要用到的函数
dlopen()
dlerror()
dlsym()
dlclose()
都存储在头文件dlfcn.h中
*/
int main() {
void *handle = dlopen("./libtest.so", RTLD_LAZY); //该处的./libtest.so表示so文件的存放位置,RTLD_LAZY是指示位
if(!handle) {
printf("open lib error\n");
cout<
return -1;
}
typedef int (*hello)(int);//该处的函数与文件test.h中需调用的函数保持一致
hello h= (hello)dlsym(handle, "helloT");// helloT为test.h中调用函数的名字,dlsym返回一个函数指针
if(!h) {
cout<
dlclose(handle);
return -1;
}
int i;
cin>>i;
(*h)(i);//用函数指针形式调用函数
dlclose(handle);
return 0;
}
编译main.cpp文件
g++ main.cpp -ldl -o main
执行./main