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


118

我正在使用来自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)库没有任何控制。我不能/不想重新编译外部库。因此,需要在我的末端修复消息。


1
对于VS2005 / ignore:4099可以正常工作。

/ ignore:4099在VS2008上可以正常工作。
汤姆(Tom)2010年

/ignore:4099在带有C ++的Visual Studio 10中可以正常工作。我得到了警告,LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)并设法以这种方式将其删除。
Manolete


3
VS2013接受/ ignore:4099就好了:)
mlvljr

Answers:


101

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

 /ignore:4099

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


5
我不认为/ ignore存在。错误仍然列出,并且/ ignore没有记录在MSDN中。我正在尝试禁用4075以“警告LNK4075:由于'/ INCREMENTAL:NO'规范而忽略了'/ EDITANDCONTINUE'”。
Nick Desjardins,2010年



7
您可以使用/ ignore:4099作为链接器标志,但是有一个陷阱。不幸的是,Microsoft决定使4099成为不可忽略的警告,因此您必须修补link.exe。听起来有点疯狂,但是别无选择。此处有更多详细信息:bottledlight.com/docs/lnk4099.html 我将HxD用作十六进制编辑器,并且按照该页面上的说明在VS10上运行良好。订单仍是4088,4099,4105
安德烈亚斯Haferburg

2
在VS 2015上运行(该项目正在使用VS2013工具集,不确定是否会有所不同)
Assimilater

50

更新2018-10-16

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

原始答案

您不能禁用该特定警告。

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

这是链接中的相关文本:

不是很明显的警告

对于某些警告编号,可以接受/ ignore选项中的指定,但不一定要执行。如果在/ wx选项未激活的情况下发生警告,则仍会显示警告消息,但在/ wx选项处于活动状态的情况下,该警告将被忽略。好像警告被认为足够重要,可以忽略尝试忽略它,但是如果用户对忽略的警告的价格过高,则不是这样。

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

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

他没有说“ 4099警告太重要而不能忽略”。他从无法关闭的事实推断出这一点。(在此注意,因为该链接的附加信息为零。)
Ben M

更新以解决您的问题@BenM
John Weldon

1
这个答案很,禁用警告4099在VS2017上对我来说效果很好。从这里的评论看来,可以从VS2013开始禁用它。
Mark Ransom '18

10

(作为记录,并且该线程在msdn论坛上消失之前,您也不能禁用该警告(至少在VS2010下),因为它在无法禁用的警告列表中(因此/ wd4099将不起作用) ,但是您可以做的是修补link.exe(通常为C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe),将其从列表中删除。我知道这听起来像手提钻。虽然有效。

例如,如果要删除4099的警告,请使用十六进制编辑器打开link.exe,然后转到15A0行,该行显示03 10(4099的小尾数),然后将其替换为FF 00(不存在)。


5
您应该在寻找序列F8 0F 00 00-03 10 00 00-09 10 00 00(4088、4099、4105为little endian中的32位双字)。在amd64 / link.exe中相同。
安德烈亚斯·哈弗堡

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 $(平台工具集版本).pdb

为以下值:

$(OutDir)vc $(平台工具集版本)D $(ProjectName).pdb

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

现在,我可以将所有发行的.lib文件,debug .lib文件和debug .pdb文件复制到开发系统上的某个位置,并且在调试模式下使用该第三方库的项目具有pdb在调试模式下需要的文件。


2
我会说这是问题答案。许多答案包含的修补链接器的建议是asinine。即使Microsoft在“使该警告不可忽略”方面是“错误的”。
塔马斯·塞莱伊(TamásSzelei)'16

3
如果要从源代码编译库,这是正确的答案。但是某些程序依赖于不包含.pdb文件的商业库,因此无法为它们生成.pdb文件。
布莱斯·瓦格纳


1

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

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


3
关闭调试信息可以解决链接器警告,但是如果没有调试信息,则断点将不起作用。这对我来说不是很有用。
Ashwin Nanjappa,2009年

2
关闭警告绝不是正确的选择。修复它们。您需要找到pdb,并确保将其复制到正确的位置。
2009年

igh,那是真的!可悲的是,在这种情况下,我找不到该pdb。
Ashwin Nanjappa,09年

1
vc80.pdb只是vc8的默认pdb名称。该警告仅表示没有调试信息可用于CGAL库。可以忽略。
JoeG 2010年

1

编辑:不要使用vc80 / Visual Studio 2005,而是CGAL库的Visual Studio 2008 / vc90版本(也许 这里开始)。

链接器工具警告LNK4099

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


2
谢谢。使用/ Z7进行编译仍然需要CGAL库的.pdb文件。/ DEBUG解决了链接器警告,但是如果没有调试信息,断点将不起作用。
Ashwin Nanjappa,2009年

1

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

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

  • 保存带有调试信息的PDB文件是保存.lib文件的文件夹。将值“ $(OutDir)$(TargetName).pdb”设置为“属性”->“ C / C ++”->“输出文件”-“程序数据库文件名”
  • 将调试信息保存在.lib文件中。将值“ C7兼容(/ Z7)”设置为Properties-> C / C ++-> General-> Debug Information Format
  • 禁用此库的生成调试信息。从属性-> C / C ++->常规->调试信息格式中删除值
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.