【问题标题】:avoid blocking by transitive dependencies when using cmake使用 cmake 时避免被传递依赖阻塞
【发布时间】:2022-10-17 18:52:18
【问题描述】:

我正在构建一个具有多个传递依赖项的 cmake 项目。例如,假设我有依赖于 lib1 的可执行 ex1。 lib1 需要 lib2。这可以这样可视化:(ex1 -> lib1 -> lib2)。

迄今为止,我将它们公开链接以表达所述依赖关系。所以 lib2 的 CMakeLists.txt 会有一行:

target_link_libraries(lib1 PUBLIC lib2)
target_link_libraries(ex1 PUBLIC lib1)

因此,lib1 包含所有来自 lib2 的 ex1 和 lib1。链接顺序没问题等。这种方法的问题是,cmake 会等到需求建立后再继续。 IE。在上面的例子中(ex1 -> lib1 -> lib2),我等待 lib1 直到 lib2 被构建,并且 ex1 构建直到 lib1 被构建才开始。

在这种情况下,lib1 是一个库,而不是可执行文件。虽然我需要一些关于链接顺序的信息并且 lib1 需要 lib2 的包含目录,但 lib1 没有必要等到 lib2 被编译和链接。 ex1在链接的时候需要lib1和lib2,但是只要源代码中没有什么恶作剧,ex1不需要等待lib1构建完成才开始编译,lib1需要等待lib2构建完成再编译.

这背后的动机是,一些源文件的编译时间比其他文件要长得多。我可以访问编译集群,并希望将其分配到容量以减少构建时间。当这些单文件编译需要很长时间时,编译集群基本上是在单个线程上编译单个文件,而它可以继续处理其他数百个文件。

在 cmake 中是否有直接的方法来实现这一点?

【问题讨论】:

  • 解决方案可能取决于生成器。选择不同的生成器也可能会产生更好的构建并行化。

标签: performance cmake compilation linker libraries


【解决方案1】:

@fabian 是正确的。 Linux 上的默认生成器是 Make。例如,Ninja 以不同的方式处理依赖关系并在我的案例中导致显着的加速。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2016-07-06
    相关资源
    最近更新 更多