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

时间:2009-03-19 09:53:24

标签: visual-studio visual-c++ linker warnings cgal

我正在使用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

如何在Visual C ++ / Studio 2008下关闭此特定链接器警告?

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

8 个答案:

答案 0 :(得分:95)

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

 /ignore:4099

这是在Properties-> Linker->命令行

答案 1 :(得分:47)

更新2018-10-16

据报道,从VS 2013开始,可以禁用此警告。请参阅@Mark Ransom的评论。

原始答案

您无法禁用该特定警告。

根据Geoff Chappell,4099警告被视为过于重要而无法忽略,即使与/ wx一起使用(将警告视为错误并在其他情况下忽略指定的警告)

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

  

不是非常不可忽视的警告

     

对于某些警告编号,/ ignore选项中的规范是   接受但不一定采取行动。是否应该发出警告   当/ wx选项未激活时,警告消息仍然是   显示,但如果/ wx选项处于活动状态,则警告为   忽略。好像警告被认为足够重要   覆盖忽略它的企图,但是如果用户也放弃了   对无条件警告的高价。

     

以下警告编号会受到影响:

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

答案 2 :(得分:9)

(对于记录和线程在msdn论坛上消失之前) 您无法禁用警告(至少在VS2010下),因为它位于无法禁用的警告列表中(因此/ wd4099将无效),但您可以执行的操作是patch link.exe(通常C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe)将其从列表中删除。听起来像一个手提钻,我知道。它虽然有效。

例如,如果要删除4099的警告,请使用十六进制编辑器打开link.exe,转到第15A0行,其中读取03 10(小端为4099)并将其替换为FF 00(不存在)。 )

答案 3 :(得分:8)

为了别人的利益,我虽然把我所做的包括在内。

由于您无法让Visual Studio(在我的情况下为2010)忽略LNK4204警告,我的方法是给它它想要的东西:pdb文件。正如我在我的案例中使用开源库一样,我已经有了构建pdb文件的代码。

但是,默认是将所有PDF文件命名为同一个东西:在我的情况下为vc100.pdb。 由于每个.lib都需要一个.pdb,这会产生一个问题,特别是如果你使用像ImageMagik这样的东西,它会创建大约20个静态.lib文件。你不能在一个目录中有20个lib文件(应用程序的链接器引用它们链接到库中),并且所有20个.pdb文件都被称为相同的东西。

我的解决方案是重建我的静态库文件,并配置VS2010以命名相对于PROJECT的.pdb文件。这样,每个.lib都会获得一个类似名称的.pdb,您可以将所有LIB和PDB放在一个目录中供项目使用。

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

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

$(IntDir)VC $(PlatformToolsetVersion).PDB

是以下值:

<强> $(OUTDIR)VC $(PlatformToolsetVersion)d $(项目名).PDB

现在而不是在中间目录中的某个地方,.pdb文件被写入输出目录,其中.lib文件也被写入,最重要的是,它们以D + 项目名称的后缀命名。这意味着每个库项目生成一个项目.lib和一个特定于项目的.pdb。

我现在能够将我的所有.lib文件,调试.lib文件和调试.pdb文件复制到我的开发系统上的一个位置,以及在调试模式下使用该第三方库的项目,在调试模式下有它需要的pdb文件。

答案 4 :(得分:3)

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

答案 5 :(得分:1)

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

或者,您可以从项目属性&gt;关闭调试信息生成。链接器&gt;调试&gt;生成调试信息字段。

答案 6 :(得分:1)

编辑:不要使用vc80 / Visual Studio 2005,而是使用CGAL库的Visual Studio 2008 / vc90版本(可能是from here)。

Linker Tools Warning LNK4099

  

你也可以用/ Z7编译,所以   pdb不需要使用,或   如果你,删除/ DEBUG链接器选项   没有对象的.pdb文件   你正在联系。

答案 7 :(得分:1)

你不能像@John Weldon那样禁用链接器警告4099。

您应该使用一些项目配置更改来重建库。您有几种选择:

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