C 链接多个共享库,所有共享库都链接到一个公共静态库

C 链接多个共享库,所有共享库都链接到一个公共静态库,c,linux,linker,C,Linux,Linker,假设您有两个共享库lib1.so和lib2.so,它们都有libcommon.a静态链接到其中。如果要动态链接lib1.so和lib2.so,编译器会抱怨符号引用不明确吗?或者编译器是否足够聪明,知道lib1和lib2之间共享libcommon符号,并允许您动态链接这两个符号?静态库将用于解决内部链接,但外部链接不会传播到共享库接口,因此不会有冲突。每个共享库都将包含自己的静态库代码副本。不会有冲突,因为当您链接到共享库时,链接器将使用提供符号的第一个共享库的定义,并且不会进一步查看其他共享库。

假设您有两个共享库lib1.so和lib2.so,它们都有libcommon.a静态链接到其中。如果要动态链接lib1.so和lib2.so,编译器会抱怨符号引用不明确吗?或者编译器是否足够聪明,知道lib1和lib2之间共享libcommon符号,并允许您动态链接这两个符号?

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

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

假设两个共享库与不同的静态库链接。但是静态库都包含一个同名函数。会有冲突

我确信这一点,因为我有一个tcl/tk应用程序,它加载两个tcl库(.so)。这两个库都与openssl库静态链接。但版本不同。
运行tcl应用程序时出现分段错误。我将其跟踪到openssl。新版本中有一个函数实现发生了更改。

至少在GNU/Linux下,如果我创建一个链接到静态库(.a)的共享库(.so),我可以从一个只链接到共享(.so)库的可执行库访问从静态库中拉入的任何符号,所以我很确定静态库中的符号会传播到共享库的接口。也许在其他一些系统上的工作方式不同,但我使用过的大多数系统都是默认链接器选项。@Jay Walker:无论如何,我更喜欢你的答案。“不管机制如何,根本的事实是不会发生冲突。”克利福德我仔细考虑了一下。出于很多原因,我不打算发表我的问题。我要删除我的评论。这不是真的。有弱导出符号和强导出符号。如果强之间有歧义,则存在错误。