静态库的文件名 libxxx.a -->对应windows的.lib文件做静态库的命令:
使用静态库:
注意:-L的作用是告诉gcc你的libxxx.a放在了哪个目录里;-l的作用是告诉gcc使用哪个静态库。
举个例子,目录结果如下:
head.h
add.c
sub.c
mul.c
执行后,在src目录下生产了add.o,sub.o,mul.o三个文件
执行后,在lib文件夹出现了libCalc.a
main.c
最后目录结构如下:
动态库的文件名 libxxx.so(对应windows的.dll文件) 编译时,需要加【-fPIC】选项。它的作用是,编译出与位置无关的代码。因为动态库在加载到下图的共享库区的时候,不一定加载到哪个位置,所以加了-fPIC后,就记录了每个函数相对于这个动态库头地址的偏移,加载后动态库在内存里的头地址是知道的,又知道了每个函数相对于头的偏移量,自然而然地就能够找到每个函数在内存里的位置了。
做静态库的命令(-shared):
用【ldd】命令查看编译出来的可执行文件文件
结果如下:
发现【libCalc.so => not found】
把做好的动态库libCalc.so拷贝到【/lib】或者【/usr/lib】下,也可以用ln做软硬连接:把当前目录下的lib目录下的libCalc.so链接到/lib下
结果如下:
发现软连接是红色的,也就是不能使用的意思,错误在于./lib/libCalc.so这个路径是不存在的,原因在于上面的命令使用的是相对路径,改成绝对路径就OK了,命令如下:
结果如下:
发现软连接是绿色的了,说明库可以使用了。
再用【ldd】命令查看编译出来的可执行文件文件 ldd a.out, 结果如下:
但是这种方法不推荐使用。理由是,放在了系统的动态库目录里,容易和别的库重复,发生冲突。
首先编辑/etc/ld.so.conf文件,添加你自己的库的路径 然后,执行:【sudo ldconfig】,就OK了。
静态库:
编译的时候,直接把静态库的代码直接编译到目标文件
执行速度快,不需要在执行的时候加载动态库
库文件修改后,必须重新编译使用库的代码
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。