想象你有一个来自供应商的静态库:libvendor.a
。
在此库的顶部,我们构建了一个静态库,其中添加了一些新功能,这些新功能使用了的一些符号libvendor.a
,我们称之为libteam.a
。因此,libteam.a
包含libvendor.a
as的一些符号libvendor.a
是一个静态库。
现在,我们开发了“组件”共享库,让我们说libcomponent1.dll
,libcomponent2.dll
。这些组件使用了fromlibteam.a
和from的某些功能libvendor.a
,因此我们链接到libvendor.a
和libteam.a
。
最后,我们有可执行的test.exe
使用libcomponent1.dll
和某些功能libvendor.a
,所以我们在链接步骤链接到两个。但是,我们在链接期间多次收到以下错误:
multiple definition of symbol...
,符号最初在中定义,libvendor.a
但也可用于libteam.a
(由于链接),因此出现错误...
如果libvendor.a
在libcomponent1.dll
库的链接步骤中删除,则undefined reference to ...
在构建时会出错test.exe
,因为符号在libteam.a
...中不可用。所以我认为链接libcomponent1.dll
到libvendor.a
和是正确的libteam.a
,如果我错了,请修复。
我想我们做错了什么,或者也许我们做不到……这个主意是拥有一个libcomponent1.dll
我们可以轻松分发并链接到应用程序的功能。人们当然也需要libvendor.a
,但这不是问题。
感谢您的帮助。
我可以建议两种方法:
停止相互链接库。而是让您的共享库具有未解析的符号,当这些符号由链接静态库的可执行文件加载时将被解析。
对您的库进行“整体存档”链接。由于您使用的是GCC,因此所需的选项如下:
gcc -o libteam.a -Wl,--whole-archive -lvendor -Wl,--no-whole-archive ...
这样,您不仅可以链接来自的“某些”符号libvendor.a
,还可以链接所有的符号,因此您无需链接libvendor.a
到任何其他使用的符号libteam.a
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句