简单介绍
静态库通常以.a
为后缀,文件命名格式为libxxx.a
,其中xxx
就是静态库的名称。我们在链接静态库的时候,静态库的内容会被编译到我们的工程中,我们在运行程序的时候就不在需要该静态库文件,可执行文件比较大。动态库通常以.so
为后缀,文件命名格式为libxxx.so
,其中xxx
为动态库的名称。动态库和静态库的最大区别在于动态库是在程序运行过程中被需要的,我们在编译代码的时候,并没有将动态库中的内容编译到项目中,这样可执行文件就会比较小,所以我们代码运行的环境中需要动态库文件的存在。
创建静态库
- 创建文件,编写程序
我创建了三个文件,分别为 1.c , 1.h , main.c 。
1.c 内容
1.h 内容#include <stdio.h> #include "./1.h" void DisplayStr(const char *p_str) { printf("%s", p_str); }
main.c 内容#ifndef __1_H__ #define __1_H__ void DisplayStr(const char *p_str); #endif //__1_H__
#include <stdio.h> #include "1.h" int main(int argc, char const *argv[]) { DisplayStr("hello world\r\n"); return 0; }
- 生成
.o
文件gcc -o 1.o -c 1.c
- 生成静态库
这样我们就得到了由 1.c 生成的静态库文件 libdis.a。ar -rcs libdis.a 1.o
使用静态库
有两种方式可以使用静态库
-
在编译的时候加上库文件
gcc main.c ./libdis.a -o test
-
通过参数指定我们想要链接的库文件
gcc main.c -o test -L . -ldis
这里
-L
指定库文件所在的位置;-l
指向静态库名称。执行
test
文件,屏幕打印 hello world
创建动态库
- 创建文件,编写程序
这里我们就使用上面创建的三个文件。 - 生成动态库
上面的两条命令可以合成一条执行gcc -fpic -c 1.c //生成目标文件 1.o gcc -shared -o libdis.so 1.o
gcc -fpic -shared 1.c -o libdis.so
使用动态库
gcc -o test main.c -L ./ -ldis
这时候会报错:
./test: error while loading shared libraries: libdis.so: cannot open shared object file: No such file or directory
这是因为程序没有找到动态库,在运行时,动态库需要被放在系统目录下。我们将libdis.so
文件移动到linux系统lib文件夹,程序就可以正常运行。还有一种设置环境变量的方法:export LD_LIBRARY_PATH=’pwd’:$LD_LIBRARY_PATH
,pwd
代表动态库所在的路径。