如果我有两个库A.lib
和B.lib
,它们都导出foo
和bar
,如何告诉链接器使用符号{{1 } foo
来自A.lib
的符号bar
?
答案 0 :(得分:3)
你做不到。对于您的示例,您可以从foo.lib
或bar.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.LIB
和B.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
。