linux下动态加载共享库

类似windows下的LoadLibrary, GetProAddress,FreeLibrary, linux 下可以通过dlopen, dlsym,dlclose对共享库进行加载,得到函数的地址,来调用函数。

提供一个例子如下:

#include <dlfcn.h>
#include <stdint.h>
//#include "plus.h"
//#include "minor.h"
typedef int (*pmmethod)(int,int);

int main()
{
    int a = 5;
    int b = 3;
    void *dlh = dlopen("libpmmethod.so",RTLD_LAZY);
    if(!dlh)
    {   
        printf("error!");
    }   
    dlerror();
    pmmethod func_plus = (pmmethod)(uintptr_t)dlsym(dlh,"plus");
    pmmethod func_minor = (pmmethod)(uintptr_t)dlsym(dlh,"minor");
    char *error;
    if((error = dlerror()) != NULL)
    {   
        fprintf(stderr,"%s\n",error);
    }   
    printf("%d + %d = %d\n",a,b,func_plus(a,b));
    printf("%d - %d = %d\n",a,b,func_minor(a,b));
    dlclose(dlh);
}

如果不需要动态加载共享库,就需要添加头文件。

在这里如果出现undefined symbol: plus,表明在你的共享库中不存在plus这个名字,一种原因是没有定义,还有一种就是你生成共享库的时候是以C++的方式生成的。需要在你导出的函数前添加extern “C”来以C语言方式导出。

也可以通过命令查看nm libpmmethod.so

......

0000047c T minor
0000046c T plus

如果以C++导出函数。通过nm libpmmethod.so得到

......

0000046c T _Z4plusii
0000047c T _Z5minorii

如果这样,上面的代码就会出现undefined symbol:的问题。

生成最终可执行程序,gcc -o main main.cpp -ldl


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值