1:
libf1.so
#ifndef F1_HH_
#define F1_HH_
extern int func1(char *p);
#endif
#include <iostream>
using namespace std;
#ifdef __cplusplus
extern "C" {
#endif
int func1(char *p)
{
if(p)
{
std::cout <<"func1: " ;
std::cout <<p << endl;
}
return 1;
}
#ifdef __cplusplus
}
#endif
libf2.so
类似, 只是输出不同
2: 编译so
g++ f1.cpp -shared -fPIC -g -o libf1.so
g++ f2.cpp -shared -fPIC -g -o libf2.so
3: 应用程序
注册信号、动态加载;收到信号后重新加载
几个注意点:
a) so的编译
b) #ifdef __cplusplus ; 防止找不到符号。 so的编译器与应用程序的编译器保持一致
c) g++ -rdynamic -lf1 -g -o test main.cpp -ldl 编译应用程序。 -lf1的意思是动态链接libf1.so -ldl是为了使得可以动态加载libf2.so
4) 应用程序使用的so必需是通过符号链接到真实的so文件; 可以直接加载so,但是这种情况下so不能被修改(覆盖),覆盖时会程序core掉