C/C++中多个库相互包含时,链接器的处理规则

C/C++中多个库相互包含时,链接器的处理规则

以下结果都是在gcc(4.8.5)下测试的,其他平台及版本不确定是否一致。

1. 在链接的时候,如果两个库中直接定义了同名接口,链接两个库是会报重复定义错误的。(无论接口实现是否相同)

2. 但是,如果两个库中的同名接口来自另外一个库,即,如果AB.a AC.a 都链接了A.a  那AB.a 和AC.a 还可以链接进同一个可执行文件或者库,这个时候

   2.1 如果两个A.a一样,则链接正常进行。

   2.2 如果两个A.a不一样但相互包含,比如AB 在AC前。

   ​    2.2.1 如果这个时候AB中的A包含AC中的A(即AC中有的AB中都有),那链接正常进行。

   ​    2.2.2 如果这个时候AC中的A包含AC中的A(即AB中有的AC中都有),那会链接失败。(把链接顺序倒一下就可以了,把AC放到AB前,即让全的放到前面)

   2.3 如果两个A.a不互相包含,则怎么放都会报错。

猜你喜欢

转载自blog.csdn.net/cyfcsd/article/details/113568349