共享库和与静态库的多层链接

r2d2leboss

想象你有一个来自供应商的静态库:libvendor.a

在此库的顶部,我们构建了一个静态库,其中添加了一些新功能,这些新功能使用了的一些符号libvendor.a,我们称之为libteam.a因此,libteam.a包含libvendor.aas的一些符号libvendor.a是一个静态库。

现在,我们开发了“组件”共享库,让我们说libcomponent1.dlllibcomponent2.dll这些组件使用了fromlibteam.a和from的某些功能libvendor.a,因此我们链接到libvendor.alibteam.a

最后,我们有可执行的test.exe使用libcomponent1.dll和某些功能libvendor.a,所以我们在链接步骤链接到两个。但是,我们在链接期间多次收到以下错误:

multiple definition of symbol...,符号最初在中定义,libvendor.a但也可用于libteam.a(由于链接),因此出现错误...

如果libvendor.alibcomponent1.dll库的链接步骤中删除,则undefined reference to ...在构建时出错test.exe,因为符号在libteam.a...中不可用。所以我认为链接libcomponent1.dlllibvendor.a是正确的libteam.a,如果我错了,请修复。

我想我们做错了什么,或者也许我们做不到……这个主意是拥有一个libcomponent1.dll我们可以轻松分发并链接到应用程序的功能。人们当然也需要libvendor.a,但这不是问题。

感谢您的帮助。

约翰·兹温克

我可以建议两种方法:

  1. 停止相互链接库。而是让您的共享库具有未解析的符号,当这些符号由链接静态库的可执行文件加载时将被解析。

  2. 对您的库进行“整体存档”链接。由于您使用的是GCC,因此所需的选项如下:

    gcc -o libteam.a -Wl,--whole-archive -lvendor -Wl,--no-whole-archive ...
    

    这样,您不仅可以链接来自的“某些”符号libvendor.a还可以链接所有的符号,因此您无需链接libvendor.a到任何其他使用的符号libteam.a

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章