栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

1.6&1.7 动态库的制作与使用

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1.6&1.7 动态库的制作与使用

本系列为牛客网Linux C++课程的课程笔记。

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可执行文件,可以执行。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/309161.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号