CMake:具有显式目标及其相互依赖性的并行构建?

时间:2013-04-10 15:05:29

标签: makefile cmake

我正在使用cmake生成GNU Makefile,我在基于GCC的环境中使用make执行。经过几年的使用它现在才意识到我有问题:

想象一下,这是我的CMakelists.txt:

add_library(lib1 STATIC empty.cpp)
add_library(lib2 STATIC empty.cpp)
add_library(lib3 STATIC empty.cpp)
add_executable(main main.cpp)
target_link_libraries(main lib1 lib2 lib3)

(empty.cpp为空,main.cpp为void main(void){})

然后我运行cmakemake -j4。它按预期工作:它并行构建lib1,lib2和lib3并将其链接到main。

但是,如果我运行make -j4 main lib1(因此显式地声明了主要和lib1目标),它会构建lib1两次。输出:

[200%] [300%] [300%] [300%] Building CXX object CMakeFiles/lib1.dir/empty.cpp.o
Building CXX object CMakeFiles/lib3.dir/empty.cpp.o
Building CXX object CMakeFiles/lib2.dir/empty.cpp.o
Building CXX object CMakeFiles/lib1.dir/empty.cpp.o
Linking CXX static library liblib1.a
Linking CXX static library liblib3.a
Linking CXX static library liblib2.a
Linking CXX static library liblib1.a
[300%] Built target lib1
[300%] Built target lib1
[  0%] Built target lib3
Built target lib2
Building CXX object CMakeFiles/main.dir/main.cpp.o
Linking CXX executable main
Built target main

这是正常的吗?为什么make没有意识到lib1被调用了两次?这是cmake或make中的问题吗?是否有解决办法或正确的方法?这是一个问题吗?

1 个答案:

答案 0 :(得分:1)

正常行为。它确实意识到lib1被调用了两次,但它只是检查是否构建了lib1

main它构建lib1。但对于您明确指定 lib1目标,它会再次检查相同的内容。