C语言使用dlfcn动态载入.so动态库
转载:https://mp.weixin.qq.com/s?__biz=Mzk0NDYzNTI1Ng==&mid=2247483722&idx=1&sn=09a9458b0126248ac2cfb6e17eb36af9&chksm=c320ed5df457644b50d17905c31847dcabf0e64e496a496a58c7dfc2deb1a943ca17d7b963ec#rd
C语言使用dlfcn动态载入.so动态库
使用dlfcn.h通过指定.so文件的位置,动态载入.so文件。在编译的时候,不需要提前链接.so文件,也不需要头文件。
代码
主程序(main.c)代码如下
#include <stdio.h>
// 首先导入了dlfcn.h头文件
#include <dlfcn.h>
int main() {
void* handle = dlopen("../lib/build/libmt.so", RTLD_LAZY); // dlopen的第一个参数制定.so文件位置,可以使用绝对路径。第二个参数可以自行查阅资料
int (*add)(int a, int b), (*sub)(int a, int b); // 定义一个函数指针
/*根据动态链接库操作句柄与符号,返回符号对应的地址*/
add = dlsym(handle, "add"); // 获取函数
sub = dlsym(handle, "sub");
int x1 = add(7, 8), x2 = sub(9,3); // 执行函数
printf("7 + 8 = %d\n", x1);
printf("9 - 3 = %d\n", x2);
dlclose(handle);
return 0;
}
mt.c文件的内容如下
int add(int a, int b){
return a + b;
}
int sub(int a, int b){
return a - b;
}
然后将其编译成libmt.so动态库就可以了。
编译操作
- 先编译
mt.c文件,得到libmt.so文件。 - 再编译
main.c文件 - 然后运行,得到一下结果
7 + 8 = 15 9 - 3 = 6
注意,在编译main.c文件的时候,需要链接dl,也就是加上-ldl选项。
对于cmake而言,需要加上TARGET_LINK_LIBRARIES(${PROJECT_NAME} dl)即可。

浙公网安备 33010602011771号