133

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

4

9 回答 9

113

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

 /ignore:4099

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

于 2009-03-19T13:43:11.530 回答
49

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
于 2009-09-25T18:33:00.357 回答
10

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

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

于 2013-06-24T09:01:29.313 回答
8

为了他人的利益,我虽然会包括我所做的。

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

但是,默认情况下将所有 PDF 文件命名为相同的名称:在我的情况下为 vc100.pdb。由于每个 .lib 都需要一个 .pdb,这会产生问题,尤其是在使用 ImageMagik 之类的东西时,它会创建大约 20 个静态 .lib 文件。您不能在一个目录中拥有 20 个 lib 文件(应用程序的链接器引用这些文件来链接库中的链接)并且将所有 20 个 .pdb 文件称为相同的东西。

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

所以对于“调试”配置,我编辑了:

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

$(IntDir)vc$(PlatformToolsetVersion).pdb

为以下值:

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

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

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

于 2014-08-08T23:59:21.593 回答
3

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

于 2009-05-04T07:49:55.060 回答
1

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

或者,您可以从 Project Properties > Linker > Debugging > Generate Debug Info 字段关闭调试信息生成。

于 2009-03-19T10:37:58.353 回答
1

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

链接器工具警告 LNK4099

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

于 2009-03-19T10:39:46.307 回答
1

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

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

  • 保存带有调试信息的 PDB 文件与保存 .lib 文件的文件夹相同。将值“$(OutDir)$(TargetName).pdb”设置为 Properties->C/C++->Output Files-Program Database File Name
  • 将调试信息保存在 .lib 文件中。将值“C7 compatible (/Z7)”设置为 Properties->C/C++->General->Debug Information Format
  • 禁用此库的生成调试信息。从 Properties->C/C++->General->Debug Information Format 中删除值
于 2012-07-06T13:59:21.940 回答
0

如果有人希望将 /ignore 添加到属性表而不是单独修改许多项目,您可以按如下方式添加它:

<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Link>
   <AdditionalOptions>/ignore:4099 %(AdditionalOptions)</AdditionalOptions>
</Link>
于 2021-08-12T17:21:55.377 回答