Skip to main content
 首页 » 编程设计

visual-c++之在不获取 LNK4006 的情况下,在 Visual C++ 中链接具有依赖项的库

2025年02月15日18haluo1

我有一组静态编译的库,这些库之间有相当深的运行依赖关系。例如,可执行文件 X 使用库 A 和 B,A 使用库 C,B 使用库 C 和 D:

X -> A 
     A -> C 
X -> B 
     B -> C 
     B -> D 

当我将 X 与 A 和 B 链接时,如果 C 和 D 没有也被添加到库列表中,我不想得到错误——A 和 B 在内部使用这些库的事实是 X 不需要的实现细节要知道。此外,当在依赖树中的任何位置添加新依赖时,使用 A 或 B 的任何程序的项目文件都必须重新配置。对于深度依赖树,所需库的列表可能会变得非常长且难以维护。

所以,我在 A 项目中使用 Librarian 部分的“Additional Dependencies”设置,添加 C.lib。在 B 的项目的同一部分,我添加了 C.lib 和 D.lib。这样做的结果是图书管理员将 C.lib 捆绑到 A.lib 中,将 C.lib 和 D.lib 捆绑到 B.lib 中。

但是,当我链接 X 时,A.lib 和 B.lib 都包含它们自己的 C.lib 副本。这会导致大量警告

A.lib(c.obj) : warning LNK4006 "symbol" (_symbol) already defined in B.lib(c.obj); second definition ignored.



如何在没有收到警告的情况下完成此操作?有没有办法简单地禁用警告,或者有更好的方法?

编辑 :我看到不止一个答案表明,由于缺乏更好的替代方案,我只是禁用了警告。嗯,这是问题的一部分:我什至不知道如何禁用它!

请您参考如下方法:

据我所知,您不能禁用链接器警告。
但是,您可以使用链接器的命令行参数忽略其中的一些,例如。/忽略:4006

将它放在链接器-> 命令行设置下的项目属性中(不记得确切位置)。

另请阅读:

Link /ignore

MSDN Forum - hiding LNK warnings

瓦切克