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);
动态库和静态库的区别
静态库生成可执行文件大,在链接阶段,连接器会赋值静态库中的相关代码插入到可执行文件中,所以生成的可执行文件体积相对更大,可以独立运行。
动态库生成可执行文件小,只有几行信息。在链接阶段链接器是将相关代码的引用信息插入到可执行文件中。在运行阶段加载动态库并调用其中的相关代码。
同一个系统上多个程序需要调用同一份公共代码时,如果采用动态库将会更高效并且节省存储空间。因为动态库可以被多个程序共享,并且内存中只会被加载一次,所以动态库也可以称之为共享库,而静态库在每个程序中都有一份副本。
动态库可以实现局部更新,而无需重新编译可执行程序,方便更新维护。更新时已有的函数不要改变函数原型。更新后不需要修改可执行文件
静态库命名规范: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);
动态库和静态库的区别
静态库生成可执行文件大,在链接阶段,连接器会赋值静态库中的相关代码插入到可执行文件中,所以生成的可执行文件体积相对更大,可以独立运行。
动态库生成可执行文件小,只有几行信息。在链接阶段链接器是将相关代码的引用信息插入到可执行文件中。在运行阶段加载动态库并调用其中的相关代码。
同一个系统上多个程序需要调用同一份公共代码时,如果采用动态库将会更高效并且节省存储空间。因为动态库可以被多个程序共享,并且内存中只会被加载一次,所以动态库也可以称之为共享库,而静态库在每个程序中都有一份副本。
动态库可以实现局部更新,而无需重新编译可执行程序,方便更新维护。更新时已有的函数不要改变函数原型。更新后不需要修改可执行文件
相关文章推荐
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- linux中静态库和动态库的生成以及使用
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- linux 静态库(.a)、动态库(.so)的创建生成和使用方法
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- 浅析静态库和动态库的区别及linux下二者的生成和使用
- Linux下GCC生成和使用静态库和动态库详解(二)
- Linux下GCC生成和使用静态库和动态库详解(一)
- Linux下GCC生成和使用静态库和动态库详解
- Linux下Gcc生成和使用静态库和动态库详解(转)
- Linux下Gcc生成和使用静态库和动态库详解(转)