Я получаю эту ошибку сборки ниндзя ниже при запуске ниндзя. Моя команда сборки CMAKEcmake -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) и реализации (Project).
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
Я пытаюсь связать библиотеку API с помощью
target_link_libraries(${PROJECT_NAME} PRIVATE ${API_LIBRARY})
Первая проблема, с которой я столкнулся, заключается в том, что еще до того, как библиотека «API» может быть загружена и собрана, я получаю сообщение об ошибке сборки ниндзя, которое я опубликовал выше. Я уверен, что ExternalDep.cmake
включен, прежде чем я пытаюсь добавить исполняемый файл Project и ссылку на библиотеку «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")
Я столкнулся с той же проблемой с Ninja
в то время как он работал нормально с Unix Makefiles
и мне удалось заставить его работать с Ninja
добавив BUILD_BYPRODUCTS
линия к моему ExternalProject_Add
блок. Пример:
ExternalProject_Add(SDL2_PROJECT
PREFIX 3rdparty
URL https://www.libsdl.org/release/SDL2-2.0.5.tar.gz
URL_MD5 d4055424d556b4a908aa76fad63abd3c
CONFIGURE_COMMAND <SOURCE_DIR>/configure ${SDL2_configure_args} --prefix=<INSTALL_DIR> --disable-shared
INSTALL_COMMAND make install -j9
BUILD_BYPRODUCTS <INSTALL_DIR>/lib/libSDL2.a
)
ExternalProject_Get_Property(SDL2_PROJECT INSTALL_DIR)
set(SDL2_INSTALL_DIR ${INSTALL_DIR})
add_library(SDL2_LIBRARY STATIC IMPORTED GLOBAL)
set_property(TARGET SDL2_LIBRARY PROPERTY IMPORTED_LOCATION ${SDL2_INSTALL_DIR}/lib/libSDL2.a)
add_dependencies(SDL2_LIBRARY SDL2_PROJECT)
Я смог решить эту проблему, создав файлы сборки Unix вместо Ninja. Я все еще не совсем уверен, была ли это единственная проблема, но это была определенно одна из проблем.