2012-03-17 37 views
4

我得通过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的)这样做,所以这是我建立的时候一个巨大的瓶颈。

回答

2

顺序执行可能是静态库lib1,lib2lib3之间建立的链接依赖关系的结果。

一个解决方法是摆脱这些静态库链接依赖关系。由于您正在构建静态库,因此删除依赖关系不会阻止它们成功链接。 main需要靠那么所有的库可执行文件:

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(main lib1 lib2 lib3) 

这种方式组织make -j建立并行库。

如果摆脱链接的依赖是不是一种选择,你可以申请原则"Any problem in computer science can be solved with another layer of indirection"

cmake_minimum_required(VERSION 2.6) 
project (test) 
add_library(lib1_objects STATIC lib1.cpp) 
add_library(lib2_objects STATIC lib2.cpp) 
add_library(lib3_objects STATIC lib3.cpp) 
add_executable(main main.cpp) 

add_library(lib1 STATIC empty.cpp) 
add_library(lib2 STATIC empty.cpp) 
add_library(lib3 STATIC empty.cpp) 

target_link_libraries(lib1 lib1_objects) 
target_link_libraries(lib2 lib2_objects lib1) 
target_link_libraries(lib3 lib3_objects lib2) 
target_link_libraries(main lib3) 

这将设置助手库(例如,lib1_objects),其中有没有依赖性,因此可建在平行下。原始库链接到这些帮助程序库,并且还设置了所需的链接依赖关系。 empty.cpp只是一个空的虚拟CPP源文件。

+0

是的,它是由链接依赖引起的,但我的观点是链接依赖不应该添加编译依赖。这不是删除链接依赖项的选项,因为实际上,我的lib2.cpp确实需要链接到lib1.cpp。例如。假设lib2.cpp调用lib1.cpp中定义的函数'f()'('f'在lib1.hpp中声明,从头开始可用) – exclipy 2012-03-17 12:20:25

+0

@exclipy查看更新后的答案。 – sakra 2012-03-17 16:53:26

+0

我假设你的意思是'add_library(lib1_objects STATIC lib1.cpp lib2.cpp lib3.cpp)'等等。它可以工作,但并不理想......我想这只是CMake的一个限制... – exclipy 2012-03-18 01:03:10