链接多个共享库,这些库都链接到一个公共静态库

7
假设您有两个共享库 lib1.so 和 lib2.so,它们都将 libcommon.a 静态链接到其中。如果您动态链接 lib1.so 和 lib2.so,编译器会抱怨模糊的符号引用吗?还是编译器足够聪明,知道 libcommon 符号在 lib1 和 lib2 之间共享,并允许您对两者进行动态链接?
3个回答

3

不会发生冲突,因为当您链接到共享库时,链接器将使用提供符号的第一个共享库中的定义,并且不会进一步查看其他共享库。从 .a 中包含的符号将在两个共享库中导出,但不会发生冲突。


这不是真的。有弱导出符号和强导出符号。如果强导出符号之间存在歧义,则会出现错误。 - Trismegistos

2

静态库将用于内部解决链接,但外部链接不会传播到共享库接口,因此不会发生冲突。每个共享库都将包括其自己的静态库代码副本。


4
至少在GNU/Linux下,如果我创建了一个链接到静态库(.a)的共享库(.so),那么我可以从只链接到共享库(.so)的可执行文件中访问任何从静态库中引入的符号,因此我很确定静态库中的符号会传递到共享库的接口中。也许在其他一些系统上情况有所不同,但对于大多数我工作过的系统,在默认的链接器选项下都是这种情况。 - Jay Walker
@Jay Walker:不管怎样,我更喜欢你的答案。无论机制如何,根本的真相是不会发生冲突。 - Clifford
@Clifford 我考虑了一下。由于很多原因,我不会发布我的问题。我将删除我的评论。 - David

0
假设两个共享库与不同的静态库链接。但是静态库都包含同名函数。会出现冲突。
我确定这一点,因为我有一个tcl / tk应用程序,它加载了两个tcl库(.so)。这两个库都与openssl库进行了静态链接。但是版本不同。 当我运行tcl应用程序时,发生了段错误。我跟踪到openssl。新版本中有一个函数实现发生了变化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接