本文将将介绍如何在linux下使用gcc生成静态库和动态库,以及如何使用库。
一、简单说明
库是二进制可执行代码,可以被操作系统载入内存执行。linux下的库有2种:静态库和动态库,它们的区别在于代码被载入的时刻不同,静态库的代码在编译过程中已经被载入可执行程序,因此最终生成的可执行文件比较大,在运行时比较占内存,不过相对快些;动态库的代码是在可执行程序运行时才载入内存的,因此最终生成的可执行文件比较小,程序运行时,不同的程序可以使用同一动态库的同一副本,节约内存,不过相对慢些。
下面我通过一个例子说明静态库动态库的生成和使用。有hello.h,hello.c,main.c三个文件,其中hello.h中为函数库的头文件,hello.c为函数库的源程序,main.c中使用库中的函数。函数如下图所示:
二、库的生成及使用
要生成库,首先要知道,静态库和动态库均是由目标文件(.o文件)创建的。其中,静态库的名字一般为lib*.a,动态库的名字一般为lib*.so。
首先使用gcc -c hello.c -o hello.o命令对hello.c进行编译,生成hello.o文件。
1、静态库
使用命令ar rcs libhello.a hello.o创建静态库文件libhello.a。
使用静态库,只要在程序中包含静态库头文件,如我的main.c包含hello.h头文件,再在使用gcc命令生成可执行文件时指明静态库名,gcc将会从静态库中将所用函数连接到可执行文件中,由于gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到静态库文件名来查找静态库文件,所以在gcc命令中只写名字即可(动态库类似),如lhello;
使用命令gcc main.c -o hello -static -L. -lhello使用库(下图中截图没截好,-lh应为-lhello),生成可执行文件,其中-L.表示使用的库位于当前目录,lhello指明使用的库名。
具体操作如下图所示:
2、动态库
使用命令gcc -shared -fPIC -o libhello.so hello.o来创建动态库libhello.so,其中fPIC用于告诉gcc产生的代码不要包含对函数和变量具体内存位置的引用(动态库运行时链接)。
使用动态库和静态库类似,只要在程序中包含动态库头文件,如我的main.c包含hello.h头文件,再在使用gcc命令生成可执行文件时指明动态库名;
使用命令gcc main.c -o hello -L. -lhello使用库,生成可执行文件hello,执行hello会报错:找不到动态库文件libhello.so,这个错误可以通过2种简单的方法解决:
- 将libhello.so复制到目录/usr/lib中(cp libhello.so /usr/lib)
- 将当前目录添加到环境变量LD_LIBRARY_PATH中(export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.)
说明:程序运行时,会在/usr/lib和/lib等目录中查找需要的动态库;
LD_LIBRARY_PATH:指定程序动态链接库文件搜索路径。
LIBRARY_PATH:指定程序静态链接库文件搜索路径。
具体操作如下图所示:
在文章结尾作2点说明:(自己试下吧)
ldd命令可查看一可执行程序依赖的动态库。
当静态库和动态库同名时,gcc将优先使用动态库。