linux加载动态链接库so文件

有时出于软件灵活性的考虑,我们不会在编译阶段直接关联so文件,而是通过dlopen等几个函数调用动态加载,主要用到的函数接口有:

  • dlopen
  • dlsym
  • dlclose

需要包含的头文件是dlfcn.h,在编译时需要加上-ldl。下面是一个简单的例子,首先我们写一个lib_printnumber函数,只是将传入的参数打印出来。

#include <stdio.h>
​
void lib_printnumber(int arg)
{
    printf("lib_printnumber, argument value is: %d \n\r",arg);
}

将libtest.c文件编译成libtest.so,命令如下:

gcc -fPIC -shared libtest.c -o libtest.so

然后我们写一个call.c文件,在里面调用lib_printnumber函数。

#include <stdio.h>
#include <dlfcn.h>
​
typedef void (*libfunc)(int);
int main(int argc,int argv[])
{
    int i;
    libfunc func;
    void *handler;
    
    /* symbol稍后解析,如果不被调用则不用解析 */
    handler = dlopen("./libtest.so",RTLD_LAZY);
    if (handler == NULL)
    {
        printf("dlopen error!\n");
        return -1;
    }
    
    func = dlsym(handler,"lib_printnumber");
    if (func != NULL)
    {
        for (i=0;i<10;i++)
        {
            func(i);
        }
    }
    dlclose(handler);
​
    return 0;
​
}

编译时加上-ldl选项:

gcc call.c -o call -ldl
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值