许多单个目标文件的LNK4099错误,Visual Studio 2015

时间:2017-06-15 20:59:34

标签: visual-studio linker-errors

在构建大型C ++ / Fortran应用程序时,我最近开始为几乎每个C ++目标文件获取LNK4099错误。例如

presentation = Builder.load_file(Aladdin.kv)

与之前的一些帖子不同,这不是因为图书馆缺少PDB信息;有错误的文件都是我自己的源代码,并且是新建的。

这是Visual Studio 2015,在64位Windows 7下构建。调试和发布版本都会出现问题。调试版本的选项是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中缺少调试信息(如错误消息所示),我无法设置断点。

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

2 个答案:

答案 0 :(得分:1)

LNK4099 documentation显示DUMPBIN命令,可用于列出与目标文件关联的.pdb文件的完整路径名...

  

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

检查F7实验中的AFile.obj和项目构建生成的另一个.obj文件可能会很有趣,以查看PDB文件名的不同之处(如果它们不同)。

假设您正在进行F7实验项目的构建,而不是重建,如果您使用F7编译AFile.cpp然后对项目进行完全重建,可能会感兴趣。完全重建将重新编译AFile.cpp,常规构建不会。

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

<强>更新

我应该添加警告/PDBALTPATH可以将上面DUMPBIN命令显示的字符串设置为与实际PDB文件的路径名不同的值。

答案 1 :(得分:0)

根据@Frank Boyne的建议,我发现了

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

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

所以,答案是,项目的程序数据库文件名属性设置为$(TargetDir)$(TargetName).pdb,应该是$(IntDir)%(Filename).pdb。在此更改之后,每个目标文件都出现.pdb文件(即,同一目录中的单独文件),构建完成时没有任何LNK4099错误。

这解决了原始问题。我想知道,如果有办法将PDB信息添加到单个输出文件中,而不是为每个目标文件生成单独的PDB文件。