编写so 库demo案例
时间: 2023-12-06 18:45:04 浏览: 31
好的,以下是一个简单的 C++ 编写的动态链接库 demo:
1. 创建一个名为 `mylib` 的文件夹,在其中创建 `mylib.h` 和 `mylib.cpp` 两个文件,分别用于声明和定义库中的函数。
`mylib.h` 文件内容如下:
```c++
#ifndef MYLIB_H
#define MYLIB_H
#ifdef __cplusplus
extern "C" {
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif // MYLIB_H
```
该文件使用了 `extern "C"` 声明,表示该函数可以被 C 语言调用。
`mylib.cpp` 文件内容如下:
```c++
#include "mylib.h"
int add(int a, int b) {
return a + b;
}
```
该文件中定义了一个名为 `add` 的函数,用于计算两个整数的和。
2. 创建一个名为 `main.cpp` 的文件,用于测试动态链接库。
`main.cpp` 文件内容如下:
```c++
#include <iostream>
#include <dlfcn.h>
#include "mylib.h"
int main() {
void* handle = dlopen("./libmylib.so", RTLD_LAZY);
if (!handle) {
std::cerr << "Failed to load library: " << dlerror() << std::endl;
return 1;
}
typedef int (*add_t)(int, int);
add_t add_func = (add_t) dlsym(handle, "add");
if (!add_func) {
std::cerr << "Failed to find symbol: " << dlerror() << std::endl;
dlclose(handle);
return 1;
}
int result = add_func(1, 2);
std::cout << "Result: " << result << std::endl;
dlclose(handle);
return 0;
}
```
该文件使用 `dlopen` 函数动态加载 `mylib` 动态链接库,并使用 `dlsym` 函数获取 `add` 函数的指针,最后调用该函数计算两个整数的和。
3. 使用以下命令编译 `mylib.cpp` 文件生成动态链接库:
```bash
g++ -shared -fPIC mylib.cpp -o libmylib.so
```
该命令将 `mylib.cpp` 编译成动态链接库 `libmylib.so`。
4. 使用以下命令编译 `main.cpp` 文件并链接动态链接库:
```bash
g++ main.cpp -ldl -o main
```
该命令将 `main.cpp` 编译成可执行文件 `main`,并链接 `libdl.so` 动态链接库。
5. 运行 `main` 可执行文件,输出如下:
```
Result: 3
```
该输出结果表明动态链接库调用成功,能够正确计算两个整数的和。