【问题标题】:How to resolve conflicting linker dependencies?如何解决冲突的链接器依赖关系?
【发布时间】:2012-02-16 11:47:09
【问题描述】:

如果我有两个库A.libB.lib,都导出foobar,我如何告诉链接器使用A.lib 中的符号foo 和符号@ 987654327@ 来自B.lib

【问题讨论】:

  • 有问题的库是静态库还是 DLL?
  • @MichaelBurr:我遇到了所有可能的组合(静态/静态、静态/动态、动态/动态),所以希望所有这些组合都有解决方案。但如果没有,动态/动态对我来说是目前最重要/最有用的。
  • 你能重新编译库吗?

标签: c visual-c++ linker dllexport


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

  • 首先,在A.LIB 上使用/REMOVE 删除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 命令中指定的最后一个对象放入输出库中。替换库成员时,请务必在包含旧对象的库之后指定新对象或库。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这与解决冲突的 linker 依赖关系有什么关系?它只是告诉我首先要避免引入链接时依赖项......
    • 好吧,你宁愿通过从每个库中动态加载你想要的特定函数来避免冲突的链接器依赖关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2016-07-18
    • 1970-01-01
    相关资源
    最近更新 更多