如何解决冲突的链接器依赖项?

时间:2012-01-23 01:30:53

标签: c visual-c++ linker dllexport

如果我有两个库A.libB.lib,它们都导出foobar,如何告诉链接器使用符号{{1 } foo来自A.lib的符号bar

3 个答案:

答案 0 :(得分:3)

你做不到。对于您的示例,您可以从foo.libbar.lib获取定义,但不能同时定义两者(特别是如果您无法重新编译库并设置符号可见性,以便只导出所需的符号)。您将它们与您的应用程序链接的顺序将取决于使用哪个库的定义(您必须使用科学方法,我认为第一个链接获胜)。 Niklas Hansson的答案是一种很好的动态方法,但似乎你不想修改原始应用程序,动态选择/选择从库中取出的符号。

如果您真的想要,可以使用十六进制编辑器来破坏符号表,以便想要导出的符号具有不同的名称(hacky,但它可以工作)。我知道在Linux上有一个名为objcopy的工具可以让你这样做(不确定Windows)。

答案 1 :(得分:3)

您可以使用LIB.EXE /EXTRACT ...仅提取您要使用的目标文件,并将这些文件链接到您自己的应用程序中。

或者您可以使用LIB创建一个包含所需元素的新库:

  • 首先,使用/REMOVE上的A.LIB删除bar.obj
    LIB.EXE /OUT:ANOBAR.LIB /REMOVE:bar.obj A.LIB
  • 然后合并A.LIBB.LIB,并确保在命令行中使用ANOBAR.LIB作为最后一个,以确保使用foo.obj代替B.LIB }“S:
    LIB.EXE /OUT:COMBINED.LIB B.LIB ANOBAR.LIB

详情请见:Managing a library,尤其是段落:

  

您可以使用LIB [...]要用新对象替换库成员,请指定包含要替换的成员对象的库以及新对象(或包含它的库)的文件名。当多个输入文件中存在具有相同名称的对象时,LIB会将LIB命令中指定的最后一个对象放入输出库中。替换库成员时,请确保在包含旧对象的库之后指定新对象或库。

我没有测试给出的命令行,但过去我曾广泛使用类似的命令行。

答案 2 :(得分:1)

如果您使用的是动态库,则可以使用dynamic loading并在加载时从A中选择foo,从B中选择bar