2009-10-23 108 views
2

我有一个图书馆X取决于图书馆Y.我有一个应用程序,其从X.调用函数C++链接的问题 - 动态与静态库的依赖关系

假设图书馆Y是仅提供静态库。如果X和Y都静态链接到应用程序A,则一切正常。但是,我希望X是一个动态(共享)库。

目前,具有A型连接器Y静态不作为动态X工作不能看到什么是在Y.

有没有什么办法让Ÿ作为一个动态库,而无需静态链接X到Y ?对Y进行包装是不好的,以便我们有一个Y的动态版本。一般来说,是否有链接器选项可用于将Y(静态链接到A)到X(动态库)?

我想问的原因是我也有库Z也取决于Y.我不想将Y静态链接到X和Z,所以X和Z可以是动态的。

希望这不是太混乱。我感谢任何帮助。

回答

1

嗯,这是相当简单的静态库转换成一个.so:

的gcc -shared library.a -oliblibrary.so

这是否解决?

+0

感谢您的回复。 不幸的是,我不允许触摸静态库...它必须保持静态库。只是想知道是否可以以某种方式将静态库(链接到应用程序)暴露给动态库。 – 2009-10-23 18:03:55

+1

动态库的符号在加载时解析...因此,动态加载的库具有未定义的引用应该能够解决针对您的应用程序的这些依赖关系。如果这有效,让我知道,我会创建另一个答案。 – dicroce 2009-10-23 18:06:46

0

正如你指出的那样 - 如果你包装了Y或者有一个动态Y,你的问题就可以解决了。

为什么你不能包装Y使它动态?

为什么你不能得到一个动态的Y?

鉴于你不妥协的约束,你可能要为Z和X的你基本上消除所有的选项链接Y ...

3

要编译X的动态版本的静态链接Y.然后应用程序只有链接X,并且对Y的使用没有注意。无论你能否做到这一点,都会因平台而异 - 我知道GCC和GNU链接器将允许它。问题是,编译用作静态库的代码和编译用作动态库的代码并不相同;生成动态库,以便它们可以重定位到任何内存区域(这使得它们可共享)。在Linux和Solaris上,这意味着使用“-fpic”指令编译共享库。如果在创建共享库时发生PIC'd和非PIC'd代码混淆(这是将Y静态链接到X时会发生的情况),那么您将收到有关未解析文本重定位的错误 - 这是链接器抱怨部分你的图书馆是无法比拟的。您可以通过传递-mimpure-text来禁用警告。但是,要意识到任何包含未使用“-fpic”编译的代码的页面(因此任何包含对Y的调用的页面)将不会在应用程序之间共享。因此,如果多个应用程序正在使用您的库,它们将无法获得通常使用共享库所带来的全部内存节省。如果这是你的平台,那么在Windows上可能有等效的标志。

编辑:在我第一次阅读没有发现你的问题与Z.尝试编译X和Z与“-z undefs”,这样GCC将忽略未定义的符号,然后当你链接你的应用程序确保Y是在X和Z之后的链接线(稍后的库会填充在较早的库中找到的参考文献)。