2012-01-23 24 views
8

如果我有两个库,A.libB.lib,两者的出口foobar,我怎么告诉链接使用来自A.lib符号fooB.lib符号bar如何解决冲突的链接器依赖关系?

+0

问题库是静态库还是DLL? –

+0

@MichaelBurr:我遇到了所有可能的组合(静态/静态,静态/动态,动态/动态),所以希望有一个解决方案。但如果没有,动态/动态对我来说目前最重要/最有用。 – Mehrdad

+0

你可以重新编译这些库吗? – sholsapp

回答

3

你不能。对于你的例子,你可以有foo.libbar.lib的定义,但不能同时使用(特别是如果你不能重新编译库并设置符号可见性,以便只导出你想要的符号)。您将它们与您的应用程序链接的顺序取决于使用哪个库的定义(您必须使用科学方法,我认为第一个链接的是胜利)。 Niklas Hansson的回答是动态执行此操作的好方法,但似乎您不想修改原始应用程序,以便动态选择/选择从库中取出哪些符号。

如果你真的想要你可以用十六进制编辑器打破符号表,这样你想要导出的符号不是有不同的名字(哈克,但它会工作)。我知道Linux上有一个名为objcopy的工具,可以让你这样做(不确定Windows)。

1

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

+0

这与解决冲突**链接器**依赖关系有什么关系?它只是告诉我,以避免首先引入链接时间依赖关系...... – Mehrdad

+0

那么,你宁愿通过动态加载你想要从每个库中的特定功能来避免冲突的链接器依赖关系。 –

3

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

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

  • 首先,使用/REMOVEA.LIB删除bar.obj
    LIB.EXE /OUT:ANOBAR.LIB /REMOVE:bar.obj A.LIB
  • 然后结合A.LIBB.LIB,使确保使用ANOBAR.LIB作为命令行中的最后一个,以确保使用其foo.obj而不是B.LIB的:
    LIB.EXE /OUT:COMBINED.LIB B.LIB ANOBAR.LIB

详情请访问:Managing a library,特别是段落:

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

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