关于dlopen()加载动态库的问题
每次更新so的时候,主程序都需要重新起动,为什么需要重新起动了。原来是使用dlopen()来加载动态库的。
关于dlopen()加载的时候,如果更新了so但不重新调用dlopen()加载的话,那么主程序执行动态库里面的代码还是按旧的代码来执行,为了测试这个我进行了如下的测试:
一、主程序首次加载dlopen()动态库,然后循环调用动态库里面的函数
二、主程序循环里面调用dlopen()加载动态库,再执行库里面的函数
这两个测试过程中,主程序不重新起动,只更新so动态库文件。
代码如下:
主程序代码
//m.cpp
1
#include
<stdio.h>
2
#include
<unistd.h>
3
#include
<dlfcn.h>
4
#include
<iostream>
5
using namespace std;
6
7
int main(int argc, char **argv) {
8
///int i = 1;
9
//while(true){
10
void *handle;
11
int (*pa)();
12
char *error;
13
14
handle = dlopen ("./so_t.so", RTLD_NOW);
15
if (!handle) {
16
fprintf (stderr, "%s\n", dlerror());
17
return 0;
18
}
19
20
dlerror();
21
*(void**)(&pa) =
dlsym(handle,"so_test");
22
if ((error = dlerror()) != NULL)
{
23
fprintf (stderr, "%s\n", error);
24
return 0;
25
}
26
27
int i=1;
28
while(true){
29
cout<<i<<"---------"<<endl;
30
pa();
31
i++;
32
sleep(2);
33
}
34
dlclose(handle);
35
//}
36
return 0;
37
}
//so_test.cpp
1
2
#include
<stdint.h>
3
#include
<iostream>
4
#include
<string>
5
6
using namespace std;
7
8
9
10
class a
11
{
12
public:
13
a(){}
14
~a(){}
15
public:
16
int
a_test(){cout<<"a_test
1"<<endl;
17
cout<<"test
222"<<endl;cout<<"test
333"<<endl;return 0;}
18
19
};
20
21
//class a;
22
extern "C"{
23 int
so_test()
24
{
25
cout<<"abcde"<<endl;
26
cout<<"test so
reload"<<endl;
27
cout<<"test
2"<<endl;
28
cout<<"test
3"<<endl;
29
a * pa = new a();
30
pa->a_test();
31
delete pa;
32
return 0;
33
}
34
}
分别编译:
主程序
g++ -o m m.cpp -ldl
so动态库:
g++ -Wall -shared -fPIC -o so_test.so so_t.cpp
经测试结果:dlopen()的加载情况
1、如果dlopen()加载一次,后续直接使用首次加载的函数,那么更新so动态库的时候,还是还原来的函数执行,不会执行更新后的逻辑
2、如果每次使用so动态库里面的函数的时候,都重新dlopen()加载动态库,那么当更新so动态库的时候,会执行新的so里面的逻辑
加载中,请稍候......