【Linux系统编程学习】 动态库的制作与使用

此为牛客网Linux C++课程1.6&1.7 的课程笔记。

1. 动态库命名规则

在这里插入图片描述

2. 动态库的制作

在这里插入图片描述
第一步,用gcc编译生成.o目标文件,注意要用-fpic参数生成与位置无关的代码;
第二步,用gcc的-shared参数生成动态库。
涉及到的两个参数之前学过:
在这里插入图片描述
代码演示:
一个简易版计算器程序目录如下:
在这里插入图片描述
然后执行:

gcc -c -fpic add.c div.c mult.c sub.c

用gcc编译成与位置无关的.o目标文件

然后执行:

gcc -shared add.o div.o mult.o sub.o -o libcalc.so

生成了名为libcalc.so的动态库文件。

3. 动态库的使用

文件目录如下:
在这里插入图片描述

有了上节课的报错铺垫,这次很容易地知道使用哪些参数,执行:

gcc main.c -o main -I ./include/ -L ./lib -l calc

生成了可执行文件main,然后执行

./main

结果报错:
在这里插入图片描述
加载动态库出错,找不到动态库文件。
这一错误的产生与动态库的原理有关。
在这里插入图片描述
动态库与静态库不同,动态库的代码不会被打包到可执行程序中,而是当程序运行时使用到库时,需要系统动态载入器获取动态库的绝对路径,然后把动态库加载到内存中。对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索elf文件的 DT_RPATH段—>环境变量LD_LIBRARY_PATH—>/etc/ld.so.cache文件列表—>/lib/,/usr/lib 目录找到库文件后将其载入内存。
我们这里可以使用ldd命令来查看main中的动态库依赖关系,执行:

ldd main

结果如下:
在这里插入图片描述
列出了动态库的名称、路径和内存地址,可见libcalc.so没有找到。

如何让系统能够找到它:

如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其它操作。
如果安装在其它目录,需要将其添加到/etc/ld.so.cache文件中,步骤如下:

  • 编辑/etc/ld.so.conf文件,加入库文件所在目录的路径;
  • 运行ldconfig ,该命令会重建/etc/ld.so.cache文件。

我们将创建的动态库复制到/usr/lib下面,执行:

sudo cp libcalc.so /usr/lib

然后运行main可执行文件,可以执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值