Linux动态链接库的简单编写与使用

我们都知道在windows环境中写链接程序,动态链接库是.lib文件,而在Linux是.so文件。那么如何编写.so文件及使用呢?下面写举一个小例子帮助初学者入门。Ps:其实网上已经有很多关于这样的文章了,在这呢,就是想帮助初学者入门及自己做个笔记。Here we go。

1.先编写一个头文件,包含要封装的函数。名字为test_so.h

#incude<stdio.h>

void test_01();

void test_02();

2.编写头文件中函数的实现 test_01.c

#include “test_so.h”

void test_01()

{

         printf(“test_01\n”);

}

同理test_02.c

#include “test_so.h”

void test_02()

{

         printf(“test_02\n”);

}

3.将上述文件编译生成.so文件


gcc test_01.c test_02.c –fPIC –shared –o libtest.so

4.接下来编写测试程序。test.c

#include “test_so.h”

#include <stdio.h>

int main()

{

         test_01();

         test_02();

         return0;

}

5.编译生成可执行文件,测试动态库是否成功。

gcc test.c –L. –ltest –o test

最后,执行./test。

 


关于上面的gcc编译的参数说明一下:(具体可以man gcc)

-fPIC: 表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

-L:库文件(.so)所在的目录

-l:指定程序要链接的库名,如libtest.so,则写为-ltest,匹配时会自动寻找libtest.so。

ps:刚开始运行时会出现错误。解决方法

ldd test显示 libtest.so not found


原因是因为没有设置LD_LIBRARY_PATH变量,通常有三种方式

1、临时修改,当退出后下次登录就失效了。

terminal中执行:exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

(:后加要增加的路径,此处写为.即为当前目录)
2
、让当前帐号以后都优先加载当前目录的动态库
修改用户的配置文件~/.bash_profile在文件末尾加上如下两行

LD_LIBRARY_PATH=./ exportLD_LIBRARY_PATH
3
、让所有帐号从此都优先加载当前目录的动态库
修改系统配置文件/etc/profile在文件末尾加上如下两行:

LD_LIBRARY_PATH=./ exportLD_LIBRARY_PATH

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值