有没有办法交错静态库和依赖的 dll 编译(MSVC)?

Is there a way to interleave static library and dependent dll compilation (MSVC)?

用MSVC编译多个库时,编译过程可以对每个库并行执行。

另一方面,如果我有一个 link 包含少量静态库的 dll,则 dll 编译过程必须等到所有库都完成编译。至少对于我目前使用的工作流程。

我知道有 2 个可能的选项来指定这种类型的 link 与 MSVC 的依赖关系:

  1. 将库添加为 dll 项目中的引用。
  2. link 通过 Poperty Pages -> Input -> Additional Dependencies 或诸如 #pragma comment(lib, "mylib.lib").
  3. 之类的 pragma 语句手动添加库

使用选项 1 时,Visual C++ 会等到所有库都已编译后才启动 dll 编译。在我看来,这是一种浪费,因为这些只是 link 时间依赖性。

当使用第二个选项时,我不确定 Visual C++ 是否会等到依赖项编译完成后再尝试 link 它们。

那么是否可以指定一个静态库依赖只是link时间依赖,并且交错静态库和依赖的dll编译?

除非您编辑了库的源代码,否则 MSVC 不会(再次)编译它。但是,如果您已经对其进行了编辑,那么显然您将不得不采用一种或另一种方式(如果您希望这些功能包含在构建中)。如果您只编辑依赖项,除非您不讨论循环依赖项,否则不会重新编译依赖项。

When using option 1, Visual C++ waits until all the libraries are compiled before it initiates the dll compilation. In my view this is a waste since these are only link time dependencies.

是的,你必须在编译依赖之前构建它的依赖。如果你在依赖中有一些东西是你最近添加的,在之前的构建之后怎么办?你必须再次编译依赖项对吗?..

When using the second option, I am not sure that Visual C++ will wait until the dependencies compilation is complete before attempting to link them.

不 Visual Studio 在编译之前不检查库是否存在。但是,您必须确保在依赖项之前编译依赖项。再一次,如果你在依赖中有新的东西,你将不得不编译它。

So is it possible to specify that a static library dependency is a link time dependency only and interleave static libraries and dependent dll compilation?

静态库就是这样工作的。库在 link 时 linked,而不是编译时。 Visual Studio 构建依赖关系的方式是它们维护一个依赖关系图。编译时,它会检查一个库是否需要重新编译,如果不需要,则保留它。

MSVC 也不编译 .obj 未更改的文件。因此,如果您想加快构建时间,请将(可移动的)头文件定义移动到源文件,以便重新编译特定的源文件,而不是所有包含的源文件(包含头文件的源文件)。

底线是,如果您使用很多库,甚至是一个大库,所有编辑过的源代码都将被重新编译。多线程构建是 唯一 加速编译的方法。或者你可以投资一台专用机器来为你编译它(服务器或其他东西)。