linux 下创建动态链接库的一个很简单的例子

13 篇文章 0 订阅
6 篇文章 1 订阅
在目录 /usr/local/src/so_lib_test 下面创建三个文件: libtest.h, libtest.c, test_main.c
libtest.h 的内容为:
/* 这里只声明了一个函数 */
int Add(int, int);
libtest.c 的内容为:
#include "libtest.h"

int Add(int a, int b)
{
  return ((a)+(b));
  }
test_main.c 的内容为:

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int main(int argc, char **argv)
{
   void *handle;
   int (*lpAdd)(int, int);
   char *error;

   if ( !(handle = dlopen("libtest.so", RTLD_LAZY)) )
   {
     fprintf(stderr, "%s\n", dlerror());
     return 1;
    }
   else
     printf("dlopen() function load libtest.so succeeded!\n");

   dlerror();    /* Clear any existing error */
   *(void **) (&lpAdd) = dlsym(handle, "Add");
   if ((error = dlerror()) != NULL)
   {
     fprintf(stderr, "%s\n", error);
     return 1;
    }
   else
     printf("Get functino offset address succeeded!\n");

   printf("Add(3,7) function output is: %d\n", (*lpAdd)(3, 7));

   if (dlclose(handle))
   {
     error = dlerror();
     fprintf(stderr, "%s\n", error);
     return 1;
     }
   else
     printf("dlclose() function close dynamic link library succeeded!\n");

   return 0;
}

执行命令 gcc libtest.c -fPIC -shared -o libtest.so

在当前目录下会生成一个名为 libtest.so 的动态库文件。

执行命令 gcc -o test_main  test_main.c -L. -ltest -ldl
在当前目录下会生成一个名为 test_main 的可执行文件

执行命令 ./test_main
会报出错误提示:
 error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

这是因为需要告诉操作系统到哪里才能找到 libtest.so 文件,执行命令
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/src/so_lib_test
(除了使用这条命令之外还有其他方法,这里就不介绍了)

再执行命令 ./test_main

可以看到以下输出
dlopen() function load libtest.so succeeded!
Get functino offset address succeeded!
Add(3,7) function output is: 10
dlclose() function close dynamic link library succeeded!

对于 dlopen(), dlsym(), dlclose() 函数的用法,在网页: http://linux.die.net/man/3/dlopen 上有详细介绍
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值