【问题标题】:Is there a way to interleave static library and dependent dll compilation (MSVC)?有没有办法交错静态库和依赖 dll 编译(MSVC)?
【发布时间】:2021-04-30 15:28:59
【问题描述】:

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

另一方面,如果我有一个将几个静态库链接在一起的 dll,则 dll 编译过程必须等到所有库完成编译。至少在我目前使用的工作流程中。

我知道使用 MSVC 指定这种类型的链接依赖的 2 个可能选项:

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

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

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

那么是否可以将静态库依赖项指定为仅链接时依赖项并将静态库和依赖的 dll 编译交错?

【问题讨论】:

  • MSBuild 没有正确地整理出工件的依赖关系,什么可以并行构建(即不相互依赖)?您可以尝试使用 CMake bilds 设置忍者选项。

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


【解决方案1】:

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

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

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

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

不,Visual Studio 在编译之前不会检查库是否存在。但是,您必须确保在依赖项之前编译依赖项。同样,如果您在依赖项中有新内容,则必须对其进行编译。

那么是否可以指定静态库依赖项仅是链接时依赖项,并交错静态库和依赖 dll 编译?

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2020-07-20
    • 2021-04-27
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多