【问题标题】:MSBuild relinks every native project after internal changes in native dependency dll在本机依赖项 dll 发生内部更改后,MSBuild 会重新链接每个本机项目
【发布时间】:2019-10-24 09:33:50
【问题描述】:

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

现在的问题:几乎每次我更改 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 行代码 - 所有这些依赖项最终都会重新链接,这需要很长时间。

【问题讨论】:

  • 嗨,你的意思是在你的项目 Foo 中,它在代码中导入 Foo.lib 吗?它是怎么来的?
  • 否,MSVC 为每个 *.dll docs.microsoft.com/en-us/cpp/build/reference/… 生成导入库 *.lib 文件如果我编译 Foo,我会得到 Foo.dll 和 Foo.lib 作为输出。然后 Bar.dll 需要与 Foo.lib 链接才能开始使用 Foo.dll

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


【解决方案1】:

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

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

【讨论】:

  • 似乎是正确的答案,因为我找不到任何避免链接的方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多