【发布时间】: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