在构建依赖库之前,为什么没有编译目标可执行文件?

时间:2015-01-26 14:46:32

标签: c++ makefile cmake

我已经设置了一个带有一个可执行E1和两个静态库L1和L2的CMake项目(3.1)。

所有三个目标都需要编译几个cpp文件。 通过target_link_libraries(E1 L1 L2) E1链接到两个库,当然,在E1可以链接之前,需要构建L1和L2。

但是使用makefile-backend和parallel builds(make -j),在L1和L2静态链接之前,甚至没有开始编译E1的cpp文件 - 无论我使用-j8还是-j256。

我可以通过CMake指定一些东西,确保E1的单位已经编译好,即使任何依赖库的(单线程)链接仍在进行中吗?

类似问题: CMake adds unnecessary dependencies between .o and .a files。 他们的解决方案是删除链接依赖或引入新的库层。 对于我的情况,这意味着将E1的cpp文件包装到单独的目标(STATIC或OBJECT)L-E1中,并链接到实际E1中的那个。 但是没有别的办法吗?

1 个答案:

答案 0 :(得分:1)

我目前的解决方案是添加中间object-library(CMake> = 2.8.8)。

所以下面的脚本没有开始编译E1的编译单元:

add_executable(E1 main.cpp logging.cpp ui.cpp)
target_link_libraries(E1 L1 L2)

替换为:

add_library(E1_OBJECTS OBJECT main.cpp logging.cpp ui.cpp)
add_executable(E1 $<TARGET_OBJECTS:E1_OBJECTS>)
target_link_libraries(E1 L1 L2)

这样就可以尽早编译cpp文件,而无需等待链接到E1的库L1和L2。

当然,任何编译时依赖项都需要转移到新目标E1_OBJECTS。