GCC系列之 静态库(二)

来源:互联网 发布:mix有windows版吗 编辑:程序博客网 时间:2024/06/14 21:43

上面讲述了静态库的加载是按需加载的方式进行的,本篇主要讲多个静态库加载的先后顺序和他们之间的依赖关系有关。

还是上面几个文件为例 c1.c为新加入的文件 main.c有所改动:

//c1.cvoid 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 等等