如果我有两个库,A.lib
和B.lib
,两者的出口foo
和bar
,我怎么告诉链接使用来自A.lib
符号foo
和B.lib
符号bar
?如何解决冲突的链接器依赖关系?
回答
你不能。对于你的例子,你可以有foo.lib
或bar.lib
的定义,但不能同时使用(特别是如果你不能重新编译库并设置符号可见性,以便只导出你想要的符号)。您将它们与您的应用程序链接的顺序取决于使用哪个库的定义(您必须使用科学方法,我认为第一个链接的是胜利)。 Niklas Hansson的回答是动态执行此操作的好方法,但似乎您不想修改原始应用程序,以便动态选择/选择从库中取出哪些符号。
如果你真的想要你可以用十六进制编辑器打破符号表,这样你想要导出的符号不是有不同的名字(哈克,但它会工作)。我知道Linux上有一个名为objcopy
的工具,可以让你这样做(不确定Windows)。
如果您使用的是动态库,则可以使用dynamic loading并从加载时选取foo
和B中的bar
。
这与解决冲突**链接器**依赖关系有什么关系?它只是告诉我,以避免首先引入链接时间依赖关系...... – Mehrdad
那么,你宁愿通过动态加载你想要从每个库中的特定功能来避免冲突的链接器依赖关系。 –
您可以使用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
的:
LIB.EXE /OUT:COMBINED.LIB B.LIB ANOBAR.LIB
详情请访问:Managing a library,特别是段落:
您可以使用LIB [...]为了与新对象代替库成员,指定包含部件库要替换的对象以及新对象(或包含它的库)的文件名。当多个输入文件中存在具有相同名称的对象时,LIB会将LIB命令中指定的最后一个对象放入输出库中。当您替换库成员时,请务必在包含旧对象的库之后指定新的对象或库。
我没有测试给出的命令行,但我过去曾广泛使用类似的命令行。
- 1. UnityContainer - 如何注册/解决与依赖关系链接
- 2. 如何解决jar文件依赖关系冲突的Android工作室
- 3. 如何解决Elasticsearch中番石榴的Maven依赖关系冲突
- 4. 冲突的依赖关系 - android studio
- 5. SBT传递依赖性解决冲突
- 6. Autofac解决依赖关系
- 7. ILSpy,如何解决依赖关系?
- 8. CXF冲突Xerces依赖关系
- 9. Intellij sbt不会解决依赖关系的依赖关系
- 10. 链接依赖关系
- 11. 解决链接依赖关系mac os x
- 12. 删除链接器依赖关系
- 13. C++ Factory和链接器依赖关系
- 14. 未能解决依赖关系。如何解决依赖性错误?
- 15. 如何解决由gradle插件创建的依赖冲突?
- 16. 如何解决IntelliJ IDEA中Java文件的依赖性冲突?
- 17. Maven:如何处理冲突的依赖关系
- 18. 如何处理Java(EE)中的冲突依赖关系
- 19. 冲突的依赖关系:如何选择?
- 20. 如何解决捆绑器中的依赖关系问题?
- 21. 如何使用DryIoc解决WebAPI控制器的依赖关系
- 22. java/maven如何在运行时解决依赖冲突
- 23. 解决Angular2中的依赖关系
- 24. 解决TFS 2015中的依赖关系
- 25. Maven无法解决的依赖关系
- 26. Hortonworks shc未解决的依赖关系
- 27. 解决JNI中的依赖关系DefineClass
- 28. 解决Clojure循环依赖关系
- 29. 设计模式 - 解决依赖关系
- 30. maven无法解决依赖关系
问题库是静态库还是DLL? –
@MichaelBurr:我遇到了所有可能的组合(静态/静态,静态/动态,动态/动态),所以希望有一个解决方案。但如果没有,动态/动态对我来说目前最重要/最有用。 – Mehrdad
你可以重新编译这些库吗? – sholsapp