静态库与动态库优先级顺序
关于静态库与动态库的区别,大家应该比较清楚;静态库中的所有符号会打包到目标中(应用程序或者库),而动态库的符号定义不会打包进目标中,因此,静态库只存在于编译阶段,而动态库除了编译阶段,还存在于运行阶段。这就是为何系统lib下会存在很多so文件。那么有这样一个问题,假如编译时同时存在静态库与动态库,那么到底优先链哪个,下面我们通过实验证明下。
1. 生成静态库
vim hello.c
#include <stdio.h>
void hello() {
printf("hello static\n");
}
gcc -o hello.o -c hello.c ar rc libhello.a hello.o
2. 生成动态库
vim hello.c
#include <stdio.h>
void hello() {
printf("hello shared\n");
}
gcc hello.c -fPIC -shared -o libhello.so
3. 测试
vim main.c
extern void hello();
int main() {
hello();
return 0;
}
gcc -o main main.c -L. -lhello
实际输出: hello shared
总结:从实际例子可以确定,gcc优先采用动态库链接