Visual Studio 2010总是重新链接项目

11

我正在将一个复杂的混合C++/.NET解决方案从VS2008迁移到VS2010。

升级后的解决方案在VS2010中运行,但是构建系统总是刷新一个C++/CLI程序集。它没有重新编译任何内容,但链接器会触及该文件。这会在整个构建中向下游产生连锁反应,导致大量依赖项被重新构建。

有什么想法可以找出它为什么认为需要重新链接该文件吗?我已经打开了详细的构建日志记录,但没有突出显示任何内容。


参见:https://dev59.com/SHE85IYBdhLWcg3wejVO,该问题是由于缺少文件而不是PDB文件引起的。 - Ben
2个回答

8
原来问题出在PDB文件名在编译器设置和链接器设置中同时被定义(且名称相同)。
在VS2010中,这似乎会导致问题,因为某种方式下,来自中间目录(编译器输出?)的“旧”pdb将复制到输出目录(链接器输出?),导致输出目录中的pdb比一些obj文件要旧,从而在下一次重新链接时迫使重新链接(循环往复)。
清除pdb名称设置似乎可以解决问题,并且默认设置是可以的。

13
您能否提供更多关于pdb定义的细节?我不确定您所说的编译器或链接器设置,并且是否从一个或两个地方清除了它。 - Frank Schwieterman

1

我只是为了记录而添加这个,以防将来有人遇到这个问题。

我们在一个大型混合FORTRAN/C++项目中遇到了类似的问题,无论是否更改任何内容都需要重新链接。似乎这个问题始于解决方案从VS2008升级到2010,尽管没有人能够完全记得。

最终,我认真研究了它(虽然很烦人,但不足以采取任何行动)。通过排除法,我找到了解决方案:

删除顶层FORTRAN项目(即生成可执行文件的项目)中“附加库目录”中的任何引号。

现在,如果您想要重现此错误,请自行查证。

  1. 打开一个新的VS2010会话。
  2. 创建一个新的FORTRAN项目,使其成为可执行文件。
  3. 将其保留为空,但将其链接到非内置的lib文件(即您自己的文件之一),并将库目录添加到“附加库目录”中。
  4. 检查这是否正确编译和链接。
  5. 现在尝试在目录周围添加双引号(“),然后多次单击“生成”。如果您的会话与我的类似,则每次都会重新链接。当您删除引号时,它会停止。

这似乎只是顶级项目上的问题,并且当这些项目是FORTRAN时 - 引号对C ++项目或创建库的项目没有影响。

如果VS不需要搜索库(例如,如果您的所有库都是内置的,如kernel32.lib),则不会发生重新链接,但无论您的库是否在具有引号的目录中或不同的目录中,都会发生重新链接。

如果有人能够证明这个“特性”,请告诉我!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接