c++ 加载.so
时间: 2023-11-26 10:02:40 浏览: 35
在Linux中,可以使用动态链接库(Shared Object,SO)来实现动态加载和卸载代码,从而实现更灵活的程序设计和扩展功能。
以下是加载动态库的基本步骤:
1. 使用 `dlopen()` 函数加载动态库,该函数返回一个句柄(`void *`)。
```c++
#include <dlfcn.h>
void* handle = dlopen("libmylib.so", RTLD_LAZY);
```
2. 如果加载成功,可以使用 `dlsym()` 函数获取动态库中导出函数的地址。
```c++
#include <dlfcn.h>
typedef int (*PFunc)(int, int); // 定义函数指针类型
PFunc pAdd = (PFunc)dlsym(handle, "Add"); // 获取函数地址
```
3. 调用导出函数。
```c++
int result = pAdd(1, 2); // 调用函数
```
4. 使用 `dlclose()` 函数释放动态库。
```c++
dlclose(handle); // 释放动态库
```
需要注意的是,动态库中的函数必须使用 `__attribute__((visibility("default")))` 关键字进行导出,例如:
```c++
__attribute__((visibility("default"))) int Add(int a, int b)
{
return a + b;
}
```
同时,动态库需要使用 `-shared` 选项进行编译,例如:
```sh
g++ -shared -fPIC -o libmylib.so mylib.cpp
```
其中,`-fPIC` 选项表示生成位置无关代码,以便在不同的进程空间中共享。