Makefile CMake:具有明确目标及其相互依赖关系的并行构建?

Makefile CMake:具有明确目标及其相互依赖关系的并行构建?,makefile,cmake,Makefile,Cmake,我正在使用cmake生成GNU make文件,我在基于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

我正在使用
cmake
生成GNU make文件,我在基于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){})

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

但是,如果我运行
make-j4 main lib1
(从而明确说明main和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中的问题吗?是否有解决方法或正确的方法?这到底是个问题吗?

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

比如说
main
它构建了
lib1
。但是对于显式指定的
lib1
target,它会再次检查是否相同