Linux命令行调用动态库,Linux下C++开发动态库so及调用方式
时间: 2024-01-10 09:03:33 浏览: 207
Linux下调用动态库主要是通过dlopen、dlsym、dlclose等函数来实现。下面是一个简单的示例:
1. 编写动态库代码
首先,我们需要编写一个动态库的代码。这里我们以一个简单的例子来说明,假设我们需要编写一个名为libmylib.so的动态库,其中包含一个用于加法运算的函数add。
// mylib.h
#ifndef MYLIB_H
#define MYLIB_H
#ifdef __cplusplus
extern "C" {
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif //MYLIB_H
// mylib.cpp
#include "mylib.h"
int add(int a, int b)
{
return a + b;
}
注意,在动态库中需要将函数声明为extern "C",这是因为在C++中函数名称会被编译器进行名称重整,而在动态库中需要使用原始的函数名称,所以需要使用extern "C"来告诉编译器不要进行名称重整。
2. 编译生成动态库
编译生成动态库的命令如下:
g++ -shared -fPIC -o libmylib.so mylib.cpp
其中,-shared选项表示生成动态库,-fPIC选项表示编译时需要生成位置无关代码,-o选项表示指定输出文件名。
3. 编写调用动态库的代码
我们可以在另一个C++程序中调用上述动态库。下面是一个简单的示例:
// main.cpp
#include <iostream>
#include <dlfcn.h>
#include "mylib.h"
int main()
{
void *handle = dlopen("./libmylib.so", RTLD_LAZY);
if (!handle) {
std::cerr << "Cannot open library: " << dlerror() << '\n';
return 1;
}
typedef int (*add_t)(int, int);
add_t add_func = reinterpret_cast<add_t>(dlsym(handle, "add"));
if (!add_func) {
std::cerr << "Cannot load symbol add: " << dlerror() << '\n';
dlclose(handle);
return 1;
}
int result = add_func(2, 3);
std::cout << "The result is " << result << '\n';
dlclose(handle);
return 0;
}
该程序首先通过dlopen函数打开动态库,并将返回的句柄保存在变量handle中。然后通过dlsym函数获取动态库中的add函数地址,并将其转换为函数指针类型add_t。最后,我们可以通过add_func指针调用add函数。
注意,在调用dlsym函数时需要指定原始的函数名称,即在编写动态库代码时使用的名称。
4. 编译生成可执行程序
编译生成可执行程序的命令如下:
g++ -o main main.cpp -ldl
其中,-ldl选项表示链接动态库加载器库。
5. 运行程序
运行可执行程序的命令如下:
./main
程序的输出应该是:
The result is 5
至此,我们成功地调用了动态库中的函数。
阅读全文