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