1.接上一篇linux下使用GCC 编译器创建静态链接库后,这篇来介绍如何创建动态链接库。
2. 还是一样,准备创建动态链接库的 源材料: .c 、 .h 文件,如下图:
3. 编写简单的源文件后,之后创建Makefile,编写Makefile,具体如下:
PS: 较静态链接库的Makefile的区别: (1)在第二行最后添加 -fPIC ,-fPIC 作用: 让编译器将我们的源文件mydll.c编译成位置无关码。
(2)在第三行,我们直接使用gcc 来编译,不用像创建静态链接库时用ar 工具。
(3)在第三行最后,添加 -shared , 让编译器生成动态链接文件。
4. 然后我们直接来Linux命令符下make即可。ls 可以看到已经生成libmydll.so文件。
5.然后我们创建测试文件test.c ,并将生成的libmydll.so和头文件mydll.h加入到test.c路径下,如下图:
6.接下来,我们编译看看效果,首先我们习惯直接编译: gcc test.c -o test , 产生如下错误:
7.由错误信息,很容易知道我们未指定我们链接的动态库,修改为: gcc test.c -o test -lmydll, 产生如下错误信息:
8.由错误信息可知,我们虽然指定了动态链接库的名字,但是没有指定我们使用动态链接库的路径,因此编译器无法找到我们链接的库,修改如下:
PS:最后加上 -L. 解释: -L 后面表示链接的路径, . 表示当前路径
9.在第8步骤后,再次编译,无警告无错误。
10.运行执行文件test,如下图:
运行报错:不能加载我们的动态链接库
11. 如果我们的代码包含动态链接库,操作系统默认去查找/usr/lib 中的动态链接库,如果没有找到我们链接的动态链接库就会报错。
解决方法有以下:
(1)复制我们的动态链接库文件到/usr/lib路径中,具体如下:
(2)增加环境变量,操作系统会优先去找环境变量中的路径,找不到的话,再去/usr/lib路径中找。具体如下:
PS: 增加环境变量:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的动态库绝对路径
12. 再次执行可执行文件test,结果正确。具体如上图。