Linux + GCC + 创建动态链接库

1.接上一篇linux下使用GCC 编译器创建静态链接库后,这篇来介绍如何创建动态链接库。


2. 还是一样,准备创建动态链接库的 源材料: .c 、 .h 文件,如下图:

Linux + GCC + 创建动态链接库

Linux + GCC + 创建动态链接库


3. 编写简单的源文件后,之后创建Makefile,编写Makefile,具体如下:


Linux + GCC + 创建动态链接库

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路径下,如下图:

Linux + GCC + 创建动态链接库


6.接下来,我们编译看看效果,首先我们习惯直接编译: gcc   test.c    -o   test   , 产生如下错误:


Linux + GCC + 创建动态链接库



7.由错误信息,很容易知道我们未指定我们链接的动态库,修改为: gcc   test.c   -o  test  -lmydll, 产生如下错误信息:


Linux + GCC + 创建动态链接库


8.由错误信息可知,我们虽然指定了动态链接库的名字,但是没有指定我们使用动态链接库的路径,因此编译器无法找到我们链接的库,修改如下:


Linux + GCC + 创建动态链接库

PS:最后加上 -L.  解释: -L 后面表示链接的路径,   . 表示当前路径 


9.在第8步骤后,再次编译,无警告无错误。


10.运行执行文件test,如下图:

Linux + GCC + 创建动态链接库


运行报错:不能加载我们的动态链接库


11. 如果我们的代码包含动态链接库,操作系统默认去查找/usr/lib 中的动态链接库,如果没有找到我们链接的动态链接库就会报错。

解决方法有以下:

(1)复制我们的动态链接库文件到/usr/lib路径中,具体如下:

Linux + GCC + 创建动态链接库

2增加环境变量,操作系统会优先去找环境变量中的路径,找不到的话,再去/usr/lib路径中找。具体如下:

Linux + GCC + 创建动态链接库

PS: 增加环境变量:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的动态库绝对路径


12. 再次执行可执行文件test,结果正确。具体如上图。