我得通过CMake的与它们之间有联系时依赖多个库管理的项目之间不必要的依赖,但每个库可以相互独立地进行编译。我如何向CMake表达这一点,以便我可以同时构建所有库?CMake的增加的.o和.a文件
例如,我想这的CMakeLists.txt:
cmake_minimum_required(VERSION 2.6)
project (test)
add_library(lib1 STATIC lib1.cpp)
add_library(lib2 STATIC lib2.cpp)
add_library(lib3 STATIC lib3.cpp)
add_executable(main main.cpp)
target_link_libraries(lib2 lib1)
target_link_libraries(lib3 lib2)
target_link_libraries(main lib3)
每个文件只定义等不同的空功能:
void f1() {}
当I型cmake . && make -j4
,我看到:
[ 25%] Building CXX object CMakeFiles/lib1.dir/lib1.cpp.o
Linking CXX static library liblib1.a
[ 25%] Built target lib1
[ 50%] Building CXX object CMakeFiles/lib2.dir/lib2.cpp.o
Linking CXX static library liblib2.a
[ 50%] Built target lib2
[ 75%] Building CXX object CMakeFiles/lib3.dir/lib3.cpp.o
Linking CXX static library liblib3.a
[ 75%] Built target lib3
[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
Linking CXX executable main
[100%] Built target main
即使我指定-j4
和编译每个的.cpp文件不应该依赖于任何.a文件,而是等待前一个编译和链接完成下一个。我宁愿看到类似于:
Building CXX object CMakeFiles/lib1.dir/lib1.cpp.o
Building CXX object CMakeFiles/lib2.dir/lib2.cpp.o
Building CXX object CMakeFiles/lib3.dir/lib3.cpp.o
Building CXX object CMakeFiles/main.dir/main.cpp.o
Linking CXX static library liblib1.a
Built target lib1
Linking CXX static library liblib2.a
Built target lib2
Linking CXX static library liblib3.a
Built target lib3
Linking CXX executable main
Built target main
是否可以告诉CMake它可以同时构建所有的.o文件?
在现实中,我中了一千万线项目约20个CPU内核在我手上(含distcc的)这样做,所以这是我建立的时候一个巨大的瓶颈。
是的,它是由链接依赖引起的,但我的观点是链接依赖不应该添加编译依赖。这不是删除链接依赖项的选项,因为实际上,我的lib2.cpp确实需要链接到lib1.cpp。例如。假设lib2.cpp调用lib1.cpp中定义的函数'f()'('f'在lib1.hpp中声明,从头开始可用) – exclipy 2012-03-17 12:20:25
@exclipy查看更新后的答案。 – sakra 2012-03-17 16:53:26
我假设你的意思是'add_library(lib1_objects STATIC lib1.cpp lib2.cpp lib3.cpp)'等等。它可以工作,但并不理想......我想这只是CMake的一个限制... – exclipy 2012-03-18 01:03:10