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动态库就可以了。

编译操作

  1. 先编译mt.c文件,得到libmt.so文件。
  2. 再编译main.c文件
  3. 然后运行,得到一下结果
    7 + 8 = 15
    9 - 3 = 6
    

注意,在编译main.c文件的时候,需要链接dl,也就是加上-ldl选项。
对于cmake而言,需要加上TARGET_LINK_LIBRARIES(${PROJECT_NAME} dl)即可。

posted @ 2020-07-21 22:08  桓公子  阅读(472)  评论(0)    收藏  举报