此为牛客网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可执行文件,可以执行。