VisualC + + : 如何禁用特定的链接器警告?

我正在使用 CGAL 中的一个库,在代码编译的链接阶段,它产生了许多关于这个表单的链接警告:

warning LNK4099: PDB 'vc80.pdb' was not found with 'gmp-vc80-mt-sgd.lib' or at 'vc80.pdb'; linking object as if no debug info

如何在 VisualC + +/Studio2008下关闭此特定链接器警告?

请注意,我对正在使用的外部(CGAL)库没有任何控制权。我不能/不想重新编译外部库。因此,需要修复我这边的消息。

112661 次浏览

PDB 文件通常用于存储调试信息。之所以发出此警告,可能是因为在链接目标对象文件时找不到文件 vc80.pdb。阅读 LNK4099给你上的 MSDN 条目。

或者,您可以从“项目属性”> “链接器”> “调试”> “生成调试信息”字段中关闭调试信息的生成。

编辑: 不使用 vc80/Visual Studio 2005,而使用 Visual Studio 2008/vc90版本的 CGAL 库(可能是 来自 给你)。

链接器工具警告 LNK4099 :

您也可以使用/Z7进行编译,因此 PDB 不需要使用,或者 删除/DEBUG 链接器选项,如果您 对象没有.pdb 文件 你在链接。

添加以下内容作为附加链接器选项:

 /ignore:4099

这在属性-> 链接器-> 命令行中

我怀疑/忽略是 VC6的 link.exe 选项。 对于 VS2005和 VS2008的链接器,没有文档化的/忽略选项可用,但链接器看起来只是忽略“/忽略: XXX”选项,没有错误,也没有效果。

更新2018-10-16

据报道,从 VS 2013开始,这个警告可以被禁用。

原始答案

你不能禁用那个特定的警告。

根据 杰夫・查普尔,4099警告被视为非常重要,不容忽视,即使是与/wx 结合使用(在其他情况下,它会将警告视为错误,并忽略指定的警告)

以下是链接中的相关文字:

不完全无法忽视的警告

对于某些警告数字,/忽略选项中的规范是 接受,但不一定采取行动 当/wx 选项不处于活动状态时,则警告消息仍然处于活动状态 但是如果/wx 选项是活动的,那么警告就是 就好像这个警告被认为足够重要 覆盖忽略它的尝试,但是如果用户已经将 因不容忽视的警告而抬高价格。

下列警告号码受到影响:

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237

您不能禁用链接器警告4099,如@John Weldon 所说。

您应该使用一些项目配置更改来重新生成库:

  • 保存带有调试信息的 PDB 文件与保存 PDB 文件的文件夹相同。Lib 文件。设置值“ $(OutDir) $(TargetName)”。“到属性-> C/C + +-> 输出文件-程序数据库文件名
  • 将调试信息保存在.lib 文件中。将值“ C7兼容(/Z7)”设置为 Properties-> C/C + +-> General-> Debug Information Format
  • 禁用此库的生成调试信息。从 Properties-> C/C + +-> General-> Debug Information Format 中删除值

(在线程消失在 msdn 论坛之前,请记录在案) 你不能禁用这个警告(至少在 VS2010下) ,因为它在不能禁用的警告列表中(所以/wd4099不起作用) ,但是你可以做的是修补 link.exe (通常是 C: Program Files (x86) Microsoft Visual Studio 10.0 VC bin link.exe)将它从这个列表中删除。听起来像手提钻,我知道。不过很管用。

例如,如果您想删除4099的警告,那么使用十六进制编辑器打开 link.exe,goto 行15A0读取0310(4099的小端点)并将其替换为 FF 00(不存在)

为了其他人的利益,我想我应该把我所做的也包括进去。

因为您不能让 Visual Studio (在我的例子中是2010)忽略 LNK4204警告,所以我的方法是给它它想要的: pdb 文件。由于我在本例中使用的是开源库,所以我已经有了构建 pdb 文件的代码。

但是,默认情况下,所有 PDF 文件的名称都是相同的: 在我的例子中是 vc100.pdb。 因为你需要一个。为每个和每个。Lib,这会产生一个问题,特别是如果您使用类似 ImageMagik 的东西,它会创建大约20个静态。Lib 文件。您不能在一个目录中拥有20个 lib 文件(您的应用程序的链接器引用该目录来链接库中的文件) ,并且拥有所有的20个 lib 文件。PDB 文件也是这么叫的。

我的解决方案是重新构建我的静态库文件,并配置 VS2010为。Pdb 文件。这边,每个人。Lib 得到一个类似的名称。Pdb,并且您可以将所有的 LIBs 和 PDB 放在一个目录中供您的项目使用。

因此,对于“ Debug”配置,我编辑了:

属性-> 配置属性-> C/C + +-> 输出文件-> 程序数据库文件名 from

$(IntDir) vc $(PlatformToolsetVersion) . pdb

为下列值:

$(OutDir) vc $(PlatformToolsetVersion) D $(ProjectName) . pdb

现在不是在中间目录中的某个位置,而是。Pdb 文件被写入输出目录,其中。Lib 文件也正在被编写,而且最重要的是,它们的名字后缀是 D + ABC 0。这意味着每个库 项目生成一个项目。Lib 和一个特定项目。PDB.

我现在可以复制我所有的版本了。Lib 文件,我的调试器。Lib 文件和调试。Pdb 文件放到我的开发系统中的一个位置,并且在调试模式下使用第三方库的项目具有调试模式下所需的 pdb 文件。

如果有人希望将/忽略添加到属性表中,而不是单独修改许多项目,您可以添加如下内容:

<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Link>
<AdditionalOptions>/ignore:4099 %(AdditionalOptions)</AdditionalOptions>
</Link>