我正在构建一个具有几个可传递依赖关系的cmake项目。例如,假设我有依赖于lib1的可执行文件ex1。lib1需要lib2。这可以被可视化为这样的:(ex1->lib1->lib2(。
到目前为止,我公开将它们联系起来,以表达所说的依赖关系。因此,lib2的CMakeLists.txt将有一行:
target_link_libraries(lib1 PUBLIC lib2)
target_link_libraries(ex1 PUBLIC lib1)
因此,lib1具有所有包含形式ex1和lib1,所有这些都来自lib2。链接订单是可以的。这种方法的问题是,cmake要等到需求构建完成后才能继续。也就是说,在上面的例子(ex1->lib1->lib2(中,我等待lib1,直到构建了lib2,而ex1构建直到构建了lib1才开始。
在本例中,lib1是一个库,而不是可执行文件。虽然我需要一些关于链接顺序的信息,并且lib1需要lib2的include目录,但lib1没有必要等到编译并链接lib2。ex1在链接时需要lib1和lib2,但只要源代码中没有恶作剧,ex1就不需要等待lib1构建完成才能开始编译,lib1也不需要等待lib2构建完成才能编译。
这背后的动机是,一些源文件的编译时间比其他文件长得多。我有权访问编译集群,并希望它能够减少构建时间。当这些单个文件的编译需要很长时间时,编译集群基本上是在单个线程上编译单个文件,而它可以处理其他数百个文件。
cmake有没有一种直接的方法可以实现这一点?
@fabian是正确的。linux上的默认生成器是Make。例如,Ninja以不同的方式处理依赖关系,并在我的案例中显著加快了速度。