想象一下,您有来自供应商的静态库:libvendor.a
。
在这个lib的顶部,我们构建了一个静态库,添加了一些使用libvendor.a
符号的新功能,让我们称之为libteam.a
。因此,libteam.a
包含libvendor.a
的一些符号,因为libvendor.a
是一个静态库。
现在,我们开发了我们的组件'作为共享库,我们说libcomponent1.dll
,libcomponent2.dll
。这些组件使用libteam.a
和libvendor.a
中的一些功能,因此我们链接到libvendor.a
和libteam.a
。
最后,我们使用test.exe
和[{1}}的一些功能使用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
,但这不是问题。
感谢您的帮助。
答案 0 :(得分:0)
我可以建议两种方法:
停止将库链接到彼此。相反,让您的共享库具有未解析的符号,当您的可执行文件加载这些符号时,这些符号将被解析,这些符号将链接静态库。
执行库的“整个归档”链接。由于您使用的是GCC,因此您需要的选项如下:
gcc -o libteam.a -Wl,--whole-archive -lvendor -Wl,--no-whole-archive ...
通过这种方式,您不仅可以链接libvendor.a
中的“某些”符号,还可以链接所有符号,因此您无需将libvendor.a
链接到使用libteam.a
的任何其他内容。