当库文件变化时,Exe执行完整链接而不是增量链接。

5
我有一个MSVC++项目,包括一个可执行文件、几个自己的静态库以及一些预编译的第三方静态库。该exe使用增量链接来加快构建时间。
当我更改可执行项目中的.cpp文件时,编译+链接非常快(<10s)。 然而,当我更改自己的某个库中的.cpp文件时,可执行项目似乎针对每个它使用的库进行了完整链接。 我不太确定它是否实际上是一个完整的链接,但从“vc90.pdb未找到”的链接器警告中,我可以看出它链接了一些根本没有改变的外部库。
以下是项目结构的示例:
- 预编译的第三方库ExtLib1、ExtLib2和ExtLib3 - 自己的库MyLib,使用第三方库ExtLib1 - 自己的可执行文件MyExe,使用MyLib和ExtLib1-3
如果在MyLib中更改.cpp文件,则会导致MyExe与MyLib、ExtLib1、ExtLib2和ExtLib3链接,即使打开了增量链接
在我的项目中,完整的链接需要大约5分钟,因此我想问:有没有办法只重新链接已更改的库?
2个回答

2

这是关于增量链接的介绍。它列出了导致完全链接的情况之一是“使用/Yu /Z7选项编译的对象已更改”,请检查您的MyLib是否捕获。


我的库是使用/Yu /Zi编译的。我尝试禁用库的预编译头文件(即删除/Yu),但并没有改变太多。也许链接器实际上正在尝试做增量链接,但连接了几乎所有东西。明天必须进一步调查此问题。 - Tim Meyer

1
当静态库发生更改时,可执行文件将始终进行完整链接,至少在Visual Studio 2013中是如此,并且您可能会在输出窗口中得到类似于以下内容的信息:
2>Link:
2>  LINK : library changed; performing full link

好消息是:我在Visual Studio 2015中进行了快速测试,增量链接似乎按预期工作。

来源:进行了大量实验和查找,遇到了同样的问题。还有这个:http://www.pcreview.co.uk/threads/incremental-linking-and-multiple-projects.1431266/ ,具体如下:

这是设计上的限制。当静态库改变时,我们不能增量链接。 这在以前也从未得到支持。

Ronald Laeremans,Visual C++团队

编辑 - 已确认使用静态库时,VS 2015具有增量链接功能:http://blogs.msdn.com/b/vcblog/archive/2014/11/12/speeding-up-the-incremental-developer-scenario-with-visual-studio-2015.aspx


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