2017-06-15 42 views
1

当构建一个大的C++/Fortran应用程序时,我最近几乎每个C++对象文件都开始出现LNK4099错误。例如很多个别目标文件的LNK4099错误,Visual Studio 2015

Cfile.obj : warning LNK4099: PDB 'lnk{3FE844DB-7378-4485-9D93-6B1B48386536}.tmp' was not found with 'Cfile.obj' or at 'C:MyApp\x64\Debug\lnk{3FE844DB-7378-4485-9D93-6B1B48386536}.tmp'; linking object as if no debug info 

与以前的帖子不同,这不是由于库缺少PDB信息;带有错误的文件都是我自己的源代码,并且是新建的。

这是在64位Windows 7下构建的Visual Studio 2015。调试和发布版本都会出现此问题。调试版本的选项是C++:/ Zi/Od;链接器:/ DEBUG,生成完整的程序数据库文件。

该应用程序是C++,使用由Fortran XE2017创建的Fortran库,并使用/ debug:full构建。链接到Microsoft库(MFC,msimg32.lib,nafxcwd.lib,libcmtd.lib等)是静态的。

如果我使用F7(Build/Compile)编译单个C++源文件AFile.cpp,然后构建项目,除了AFile.obj没有任何内容之外,我会得到所有相同的错误。 AFile的调试信息位于应用程序的PDB中(我可以设置断点)。有错误的文件在应用程序的PDB中缺少调试信息(如错误消息所述),并且我无法设置断点。

什么设置或配置可能会导致这种神秘的行为?小项目我没有这个问题。

+0

你有多少内存,你让Windows设置交换文件大小?多少磁盘空间?这只是要检查,我有(不同)链接器失败试图建立与8 GB的RAM的铬。 –

+0

32 GB RAM,2.9 TB空闲磁盘。 Windows设置交换文件大小。 – Woody20

回答

1

LNK4099 documentation的示出了可以用于列出与对象文件相关联的.pdb文件的全路径名称的DUMPBIN命令

DUMPBIN /section:.debug$T/RAWDATA对象名.obj

从您的F7实验和项目构建生成的另一个.obj文件中查看AFile.obj以了解PDB文件名称如何不同(如果它们不同)可能很有趣。

假设您在F7实验中正在构建项目而不是重建,那么看看如果使用F7编译AFile.cpp会发生什么情况,然后对项目进行完整重建可能会很有趣。完整的重建会重新编译AFile.cpp,而常规的构建不会。

一旦你知道你应该寻找什么,你可以开始尝试弄清楚你的构建是:不是创建PDB文件;创造他们在错误的地方;用错误的名字创建它们;或者在创建后删除它们。

UPDATE

我应该补充需要提醒的是/PDBALTPATH可以设置由DUMPBIN命令上方以从实际PDB文件的路径名不同的值示出的字符串。

0

每@Frank博伊恩的建议下,我发现

dumpbin /section:.debug$T /rawdata *.obj

列出了所有的目标文件,二进制数据,即0x1B轮空,之后的完整路径App.pdb相同的结果。重新编译单个文件会显示相同的路径,但二进制数据稍有不同。

因此,答案是,该项目的程序数据库文件名属性设置为$(TargetDir)$(TargetName).pdb,当它应该是$(IntDir)%(Filename).pdb。在此更改之后,每个目标文件都会出现.pdb文件(即,将文件分散在同一目录中),并且完成编译时不会出现任何LNK4099错误。

这解决了原来的问题。不过,我想知道是否有办法将PDB信息添加到单个输出文件中,而不是为每个对象文件生成单独的PDB文件。

相关问题