linux下显式加载调用动态库

时间:2023-02-08 18:53:30

由于进程在启动时,只需使用很多动态库中的一个,为了节约运行内存,使用显式方式加载动态库。

动态库显式调用和隐式调用这里就不在详细说了。下面是显式加载调用动态库的过程。

代码部分分为: test_so1.cpp , test_so1.h,test_dl.cpp,   test_so2.cpp,test_so1.h

其中test_so1.cpp为动态库1源代码, test_so1.h为动态库1的头文件;test_so2.cpp为动态库2源代码, test_so2.h为动态库2的头文件;test_dl.cpp为测试代码。

以下依次为各文件源码:

/// test_so1.cpp
#include "test_so1.h"
#include <iostream>
using namespace std;

int test(void)
{
cout << "Test so 11111!" << endl;

return 0;
}
/// test_so1.hextern "C" {int test(void);}
/// test_so2.cpp#include "test_so2.h"#include <iostream>using namespace std;int test(void){    cout << "Test so 22222!" << endl;    return 0;}
/// test_so2.hextern "C" {int test(void);}

/// test_dl.cpp
#include <stdio.h>
#include <string>
#include <dlfcn.h>

int main(int argc, char **argv)
{
void *handle;
char *error;
typedef void (*pf_t)(); //声明函数指针类型
if(argc!=2)
{
printf("Argument Error! You must enter like this:\n");
printf("./test_dl test_so1.so\n");
return 1;
}

handle = dlopen(argv[1], RTLD_NOW); //打开argv[1]指定的动态库
if (!handle)
{
fprintf (stderr, "%s\n", dlerror());
return 1;
}

dlerror();
pf_t pf=(pf_t)dlsym(handle,"test"); //指针pf指向test在当前内存中的地址
if ((error = dlerror()) != NULL)
{
fprintf (stderr, "%s\n", error);
return 1;
}
pf(); //通过指针pf的调用来调用动态库中的test函数
dlclose(handle); //关闭调用动态库句柄

return 0;
}
编译命令依次如下:

动态库1的编译命令:g++ -fpic -shared test_so1.cpp -o test_so1.so

动态库2的编译命令:g++ -fpic -shared test_so2.cpp -o test_so2.so

测试代码的编译命令:g++ -g -o test_dl test_dl.cpp -ldl


测试命令:./test_dl ./test_so1.so 输出结果: Test so 11111!

                    ./test_dl ./test_so2.so 输出结果: Test so 22222!