在运行 Ninja 时,我在下面遇到了这个 ninja build 错误。我的 CMAKE 构建命令是cmake -G"Ninja" -DCMAKE_BUILD_TYPE=Release
.
ninja: error: 'ext_deps/api/src/ext_api/build/src/lib/libapi.a', needed by 'Project', missing and no known rule to make it
假设我的项目包含一个 API(通过 CMAKE 从 GitHub 下载)和实现(项目)。
The layout would look like:
Project/
-- build/
-- cmake/modules
----- ExternalDep.cmake
----- FindAPI.cmake
-- CMakeLists.txt
-- src/
---- CMakeLists.txt
-- include/
假设在顶层CMakeLists.txt
我做的是设置构建设置、CXX 标志等的常规业务,然后我调用include(ExternalDep)
,它检查“API”库是否在用户的系统中(如果没有,它是通过 CMAKE 下载的)。在src/CMakeLists.txt
我尝试使用
target_link_libraries(${PROJECT_NAME} PRIVATE ${API_LIBRARY})
我遇到的第一个问题是,在“API”库甚至可以下载和构建之前,我收到了上面发布的 ninja build 错误。ExternalDep.cmake
在我尝试添加项目可执行文件并链接到“API”库之前,我很肯定它已包含在内。
这是一个简化版本ExternalDep.cmake
:
set(EXT_DEPS_PREFIX "ext_deps")
ExternalProject_Add(ext_lib
GIT_REPOSITORY "https://github.com/fake/api.git"
GIT_TAG "master"
PREFIX "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api"
TMP_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api-tmp"
STAMP_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api-stamp"
CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
SOURCE_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api/ext_api"
BINARY_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api/ext_api-build"
BUILD_ALWAYS true
TEST_COMMAND "")
add_dependencies(ext_projects ext_api)
set(API_LIBRARY "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api/ext_api-build/src/lib/libapi.a")