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

时间:2015-11-28 12:59:05

标签: c++ dll linker

想象一下,您有来自供应商的静态库:libvendor.a

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

现在,我们开发了我们的组件'作为共享库,我们说libcomponent1.dlllibcomponent2.dll。这些组件使用libteam.alibvendor.a中的一些功能,因此我们链接到libvendor.alibteam.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.alibcomponent1.dlllibvendor.a联系起来是正确的,如果我错了,请修正我。

我想我们做错了什么或者我们不能这样做...... 我们的想法是拥有一个libteam.a,我们可以轻松地分发和链接到应用程序。人们也肯定需要libcomponent1.dll,但这不是问题。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我可以建议两种方法:

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

  2. 执行库的“整个归档”链接。由于您使用的是GCC,因此您需要的选项如下:

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

    通过这种方式,您不仅可以链接libvendor.a中的“某些”符号,还可以链接所有符号,因此您无需将libvendor.a链接到使用libteam.a的任何其他内容。