我有一个静态链接到库 ( libA.2.0.a
) 并动态链接到另一个库 ( libB.so
) 的程序。libB.so
还动态链接到旧版本的 libA ( libA.1.0.so
)。
这种配置可行吗?如果是这样,系统如何知道使用来自libA.2.0.a
for 我的程序的符号和来自libA.1.0.so
for的符号libB.so
?
我有一个静态链接到库 ( libA.2.0.a
) 并动态链接到另一个库 ( libB.so
) 的程序。libB.so
还动态链接到旧版本的 libA ( libA.1.0.so
)。
这种配置可行吗?如果是这样,系统如何知道使用来自libA.2.0.a
for 我的程序的符号和来自libA.1.0.so
for的符号libB.so
?
是的,这种配置是可能的。
在回答您关于系统如何知道如何使用符号的问题时,请记住所有链接都发生在构建时。构建完成后,不再是“符号”的问题,只是在不同地址调用各种函数。
在构建 libB.so 时,它会设置到 libA.1.0.so 的链接。它不知道也不关心使用它的其他应用程序会做什么,它只知道如何映射自己的函数调用。
在构建应用程序本身时,应用程序链接到 libB.so。无论 libB.so 调用什么,应用程序都完全不知道。该应用程序还静态链接到 libB.so 不关心的库。
一个问题:如果 libA 使用静态变量,那么 libB.so 将可以访问一组静态变量,而应用程序可以访问一组不同的、独立的静态变量。