有没有办法交错静态库和依赖的 dll 编译(MSVC)?
Is there a way to interleave static library and dependent dll compilation (MSVC)?
用MSVC编译多个库时,编译过程可以对每个库并行执行。
另一方面,如果我有一个 link 包含少量静态库的 dll,则 dll 编译过程必须等到所有库都完成编译。至少对于我目前使用的工作流程。
我知道有 2 个可能的选项来指定这种类型的 link 与 MSVC 的依赖关系:
- 将库添加为 dll 项目中的引用。
- link 通过 Poperty Pages -> Input -> Additional Dependencies 或诸如
#pragma comment(lib, "mylib.lib")
. 之类的 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
未更改的文件。因此,如果您想加快构建时间,请将(可移动的)头文件定义移动到源文件,以便重新编译特定的源文件,而不是所有包含的源文件(包含头文件的源文件)。
底线是,如果您使用很多库,甚至是一个大库,所有编辑过的源代码都将被重新编译。多线程构建是 唯一 加速编译的方法。或者你可以投资一台专用机器来为你编译它(服务器或其他东西)。
用MSVC编译多个库时,编译过程可以对每个库并行执行。
另一方面,如果我有一个 link 包含少量静态库的 dll,则 dll 编译过程必须等到所有库都完成编译。至少对于我目前使用的工作流程。
我知道有 2 个可能的选项来指定这种类型的 link 与 MSVC 的依赖关系:
- 将库添加为 dll 项目中的引用。
- link 通过 Poperty Pages -> Input -> Additional Dependencies 或诸如
#pragma comment(lib, "mylib.lib")
. 之类的 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
未更改的文件。因此,如果您想加快构建时间,请将(可移动的)头文件定义移动到源文件,以便重新编译特定的源文件,而不是所有包含的源文件(包含头文件的源文件)。
底线是,如果您使用很多库,甚至是一个大库,所有编辑过的源代码都将被重新编译。多线程构建是 唯一 加速编译的方法。或者你可以投资一台专用机器来为你编译它(服务器或其他东西)。