cmake ExternalProject_Add 项目未在依赖它的目标之前构建

lan*_*nza 5 cmake ninja

我有

ExternalProjectAdd(googletest ......)
...
add_library(gtest_main UNKNOWN IMPORTED)
set_target_properties(gtest_main PROPERTIES
    "IMPORTED_LOCATION" ${binary_dir}/googlemock/gtest/libgtest_main.a
)
...
add_executable(sometest somefile.cpp)
target_link_library(sometest gtest_main)
add_dependencies(sometest googletest)
Run Code Online (Sandbox Code Playgroud)

但显然说明可执行文件的依赖sometestgoogletest实际上并不需要ExternalProject_Add的build命令之前,为构建命令来调用sometest

如果我运行ninja,它会抱怨它找不到libgtest_main.a. 但是如果你调用ninja googletest && ninja sometest它就可以了。

那么,您如何判断cmakesometest取决于googletest调用的构建命令?

Pav*_* K. 3

正如评论中提到的,该问题与Ninja生成器及其扫描依赖项的机制有关(更多详细信息)。

为了解决这个问题,需要添加额外的Cmake选项BUILD_BYPRODUCTS以及将要编译的库的预期路径:

ExternalProject_add(
    ...
    BUILD_BYPRODUCTS ${CMAKE_BINARY_DIR}/googlemock/gtest/libgtest_main.a
)
Run Code Online (Sandbox Code Playgroud)

这应该有助于消除这样的错误:

ninja:错误:'gtest/libgtest_main.a','sometest.so'需要,缺少并且没有已知的规则来制作它

我知道这个答案已经很晚了,但希望它能帮助某人安全几个小时。