GCC编译时互依赖动态库无需重复链接的原因咨询
GCC动态库无需重复链接的原因说明
- 你掌握的链接规则仅适用于**静态库(.a)**链接场景
静态库是多个.o目标文件的归档包,链接器处理静态库时遵循严格的顺序逻辑:按输入顺序遍历所有目标文件、静态库,遇到未定义符号放入未解析符号列表,仅会用当前正在处理的文件/静态库的符号尝试解析列表中的未定义项,处理完成的静态库不会被回溯查找。
这种逻辑下存在互相依赖的静态库才需要重复写-la -lb -la这类参数,让链接器多次扫描对应静态库完成符号解析。 - 动态库(
.so)的链接逻辑和静态库完全不同
动态库本身是已经经过一次链接的完整目标文件,链接时会把自身全部符号表暴露给链接器的全局符号池,只要你在链接参数中指定了对应的动态库,不管参数顺序,所有动态库的符号都可以用来解析任意位置的未定义符号,不存在处理完就丢弃的规则,自然也不需要重复写链接参数。 - 补充说明
你提到的「liba.so依赖libb.so时必须先写-la再写-lb才不会报错」的场景,同样仅在静态链接时生效,全动态链接场景下两个库的参数顺序不影响编译结果。
内容的提问来源于stack exchange,提问作者velscode
相关产品推荐
相关产品推荐

