【发布时间】:2011-01-25 02:52:06
【问题描述】:
假设您有 2 个共享库 lib1.so 和 lib2.so,它们都有 libcommon.a 静态链接。如果要动态链接 lib1.so 和 lib2.so,编译器会抱怨符号引用不明确吗?或者编译器是否足够聪明,可以知道 libcommon 符号在 lib1 和 lib2 之间共享,并允许您动态链接两者?
【问题讨论】:
假设您有 2 个共享库 lib1.so 和 lib2.so,它们都有 libcommon.a 静态链接。如果要动态链接 lib1.so 和 lib2.so,编译器会抱怨符号引用不明确吗?或者编译器是否足够聪明,可以知道 libcommon 符号在 lib1 和 lib2 之间共享,并允许您动态链接两者?
【问题讨论】:
不会发生冲突,因为当您链接到共享库时,链接器将使用第一个提供符号的共享库中的定义,而不会进一步查看其他共享库。 .a 中包含的符号将在两个共享库中导出,但不会冲突。
【讨论】:
静态库将用于在内部解析链接,但外部链接不会传播到共享库接口,因此不会发生冲突。每个共享库都将包含它自己的静态库代码副本。
【讨论】:
假设两个共享库链接到不同的静态库。但是静态库都包含一个同名的函数。会有冲突。
我很确定,因为我有一个 tcl/tk 应用程序,它加载了两个 tcl 库 (.so)。这两个库都与 openssl 库静态链接。但有不同的版本。 运行 tcl 应用程序时发生分段错误。我将其追踪到openssl。新版本的功能实现有所改变。
【讨论】: