最近在看《深入理解计算机系统(第三版)》,书里面一些示例代码用到了一些包装函数,这些包装函数对一些函数的进行了简单的包装,目的是为了使得代码更加简洁。这些函数都定义在"csapp.c"文件中,相应的头文件为"csapp.h"文件。为了方便以后的使用,我将"csapp.c"文件生成动态链接库文件。
根据别人博客中的说法,linux系统中动态库的搜索路径为(参考于这里[1],[2],[3],[4]):
- 编译目标代码时指定的动态库搜索路径;如:gcc -Wl,-rpath=/xxx/lib
- 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
- 配置文件/etc/ld.so.conf中指定的动态库搜索路径;
- 默认的动态库搜索路径/lib;
- 默认的动态库搜索路径/usr/lib。
第一种方式比较麻烦,每次都要用完整的动态库文件的路径参数指定生成的动态库的具体位置,最后两种方式只需要将生成的动态库文件放入对应的目录下即可。对于自己生成的库文件似乎一般是放在/usr/local/lib目录下(参考于这里),但是以上动态库的搜索路径不包含该目录。这时我们需要将该目录放到环境变量LD_LIBRARY_PATH中或配置文件/etc/ld.so.conf中。对于第三中方法,当我们将动态库目录添加中配置文件/etc/ld.so.conf中之后还要运行一次命令:ldconfig,该命令将配置文件/etc/ld.so.conf更新后的内容更新到文件/etc/ld.so.cache中,因为动态库搜索时实际搜索的是该文件而不是配置文件/etc/ld.so.conf。这里我们采用第三种方法。
- 将"csapp.c"文件生成动态库文件
- 将生成的动态库文件添加到系统
查看配置文件/etc/ld.so.conf我们知道搜索动态库时会搜索目录/etc/ld.so.conf.d下所有".conf"文件中的目录,但是这些文件中都没有包含目录/usr/local/lib。我们因此新建一个"local.conf"文件并将该目录放在该文件中。(参考于这里)
- 编译用到了动态库中函数的源文件并运行
这里的源文件用到了"csapp.c"中的包装函数"Fork"。由于这里我们生成的库"libcsapp.so"和"pthread"库都不是linux系统默认的库,因此必须加上对应库的名字参数"-lpthread"和"-lcsapp"。(参考于这里和这里)即使是我们已经将我们生成的动态库的文件路径添加到了搜索路径中。这里比较特殊的一点是,在linux系统中不使用头文件“pthread.h”和“csapp.h”程序编译也可以通过并运行,只是会有警告而已,但是在windows系统中就不行。