关于静态库与动态库的区别,大家应该比较清楚;静态库中的所有符号会打包到目标中(应用程序或者库),而动态库的符号定义不会打包进目标中,因此,静态库只存在于编译阶段,而动态库除了编译阶段,还存在于运行阶段。这就是为何系统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优先采用动态库链接