我已经设置了一个带有一个可执行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中的那个。 但是没有别的办法吗?
答案 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。