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

1. 动态库命名规则

怎么使用动态库文件导入python库 动态库的创建与使用_bc

2. 动态库的制作

怎么使用动态库文件导入python库 动态库的创建与使用_linux_02


第一步,用gcc编译生成.o目标文件,注意要用-fpic参数生成与位置无关的代码;

第二步,用gcc的-shared参数生成动态库。

涉及到的两个参数之前学过:

怎么使用动态库文件导入python库 动态库的创建与使用_库文件_03


代码演示:

一个简易版计算器程序目录如下:

怎么使用动态库文件导入python库 动态库的创建与使用_linux_04


然后执行:

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. 动态库的使用

文件目录如下:

怎么使用动态库文件导入python库 动态库的创建与使用_怎么使用动态库文件导入python库_05

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

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

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

./main

结果报错:

怎么使用动态库文件导入python库 动态库的创建与使用_库文件_06


加载动态库出错,找不到动态库文件。

这一错误的产生与动态库的原理有关。

怎么使用动态库文件导入python库 动态库的创建与使用_动态库_07


动态库与静态库不同,动态库的代码不会被打包到可执行程序中,而是当程序运行时使用到库时,需要系统动态载入器获取动态库的绝对路径,然后把动态库加载到内存中。对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索elf文件的 DT_RPATH段—>环境变量LD_LIBRARY_PATH—>/etc/ld.so.cache文件列表—>/lib/,/usr/lib 目录找到库文件后将其载入内存。

我们这里可以使用ldd命令来查看main中的动态库依赖关系,执行:

ldd main

结果如下:

怎么使用动态库文件导入python库 动态库的创建与使用_库文件_08


列出了动态库的名称、路径和内存地址,可见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可执行文件,可以执行。