上面讲述了静态库的加载是按需加载的方式进行的,本篇主要讲多个静态库加载的先后顺序和他们之间的依赖关系有关。
还是上面几个文件为例 c1.c为新加入的文件 main.c有所改动:
//c1.c
void f1_run1(void);
void c1_run1(void)
{
f1_run1();
}
//main.c
//void f1_run1(void);
//void f1_run2(void);
//void f2_run1(void);
//void f2_run2(void);
void c1_run1(void);
int main(int argc, char **argv)
{
c1_run1();
return 0;
}
由上面可以 c1.c 依赖于f1.c
将c1.c编成静态库libmyc.a (由于和libc.so 标准库名字冲突 哈哈 故加了个my)
此时编译main.c 注意libmyc.a 依赖于libf.a
根据链接的规则依赖别人的放在别人的前面
所以myc 要在 f之前:
如果交换位置会报出未定义的引用的错误:
其实大家可以做个实验 即使这2个库正确 如果把main.c放到最后 即 gcc -L. -lmyc -lf main.c
main.c中调用的函数编译器也会报出类似的问题
动态库和动态库之间不存在这个问题,后面将继续深入讲解 混合使用的时候的各种情况还有gcc一些参数
如-Wl,--allow-shlib-undefined 等等