您的位置:首页 > 运维架构 > Linux

Linux 简单,实用,快速了解静态库和动态库的生成和使用方法以及两者的区别

2018-03-04 14:31 543 查看
静态库的生成和使用
静态库命名规范:lib[your_library_name].a
lib为前缀,中括号里面的是静态库名,扩展名为.a

例如:以hello.c hello.h为例,我们将创建的静态库名为myhello,静态库文件名就是libmyhello.a,
生成静态库:
Linux创建静态库分为两步:
①将代码文件编译成目标文件,即将hello.c文件编译成hello.o文件,使用指令为:gcc -c hello.c
②利用ar工具将目标文件hello.o打包成静态库文件,使用指令:ar crv libmyhello.a hello.o

这样就生成了libmyhello.a文件,

使用静态库:
gcc main.c ./libmyhello.a  在当前目录下链接静态库;
或者:gcc main.c -L. -lmyhello
-L. 跟搜索路径, 这里表示当前路径,也可以跟绝对路径;
-l参数就是用来指定程序要链接的库,也就是库名,

动态库的生成和使用
Linux系统搜索动态库的方式:
/etc/ld.so.cache  通过ldconfig命令更新该文件(ldconfig命令通过读取/etc/ld.so.conf进行更新)
LD_LIBRARY_PATH
/lib
/usr/lib

Linux动态库的命名规则:
动态链接库的名字形式为libxxxx.so ,前缀是lib,后缀名为.so

生成动态库:
①生成目标文件,此时要加编译器选项-fPIC
-fPIC是创建与地址无关的编译程序,是为了能够在多个应用程序间共享;
指令:gcc - fPIC -c hello.c
②生成动态库,此时要加链接器选项-shared
-shared是指定生成动态链接库;
指令:gcc -shared -o libmyhello.so hello.o

以上两步可以写成一条指令:
gcc hello.c -shared -fPIC  -o libmyhello.so

使用动态库:
gcc main.c ./libmyhello.so  //在当前目录下调用; //这样生成的可执行文件可以直接执行;

gcc main.c -L. -lmyhello     //也是在当前目录下调用,生成的可执行文件不可以直接执行,需要将libmyhello.so文件拷贝到/usr/lib目录下
所以在使用动态库之前,将生成的libmyhello.so文件拷贝到/usr/lib目录下(或者/lib);

动态库和静态库的区别
静态库生成可执行文件大,在链接阶段,连接器会赋值静态库中的相关代码插入到可执行文件中,所以生成的可执行文件体积相对更大,可以独立运行。
动态库生成可执行文件小,只有几行信息。在链接阶段链接器是将相关代码的引用信息插入到可执行文件中。在运行阶段加载动态库并调用其中的相关代码。
同一个系统上多个程序需要调用同一份公共代码时,如果采用动态库将会更高效并且节省存储空间。因为动态库可以被多个程序共享,并且内存中只会被加载一次,所以动态库也可以称之为共享库,而静态库在每个程序中都有一份副本。
动态库可以实现局部更新,而无需重新编译可执行程序,方便更新维护。更新时已有的函数不要改变函数原型。更新后不需要修改可执行文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: