在对本机依赖项dll进行内部更改后,MSBuild会重新链接每个本机项目

时间:2019-06-09 21:58:38

标签: c++ visual-studio visual-c++ msbuild linker

让我们想象一下这种情况: 项目Foo编译为Foo.dll和Foo.lib。 Project Bar编译为Bar.dll,并将Foo引用为VS项目中的依赖项。

现在是问题:几乎每次我更改Foo.dll的内部详细信息(不是API,不是导出函数集)时-Foo.lib会更新,而Bar.dll会与新的链接Foo.lib。如果我在VS中打开详细的输出,我会看到:

Source compilation required: input C:\PROJECTS\FOO\RELEASEUNICODE\FOO.LIB is newer than output C:\PROJECTS\BAR\RELEASEUNICODE\BAR.DLL.

然后下一个命令启动link.exe以链接新的Bar.dll

问题:为什么会这样?我对DLL的lib文件的想法不是很熟悉(我在Linux中还没有看到.so动态lib的.a文件),但是dll文件的主要思想不是要避免任何编译时链接吗?为什么每次更改foo.dll的内部文件时lib文件都会更改?有没有一种方法可以避免重新链接依赖库?在我的项目中,我有数十个依赖于foo.dll的dll,并且每次我在foo.dll中更改10行代码时,所有这些依赖项最终都会重新链接,这会花费很多时间。

1 个答案:

答案 0 :(得分:3)

MSBuild只是在修改文件时查找时间戳。知道没有更改公共API不够聪明。 因此,msbuild操作的规则是,如果输入是新的,则必须重新构建依赖项(在您的情况下为条)(在您的情况下,只需重新链接)。

我想如果msbuild知道api的更改,那它就必须解析所有代码并保留整个代码的某种数据库,这对于构建几乎是不必要的并且非常昂贵。