Я получаю эту ошибку строчки ninja ниже при запуске Ninja. Моя команда сборки CMAKE: cmake -G"Ninja" -DCMAKE_BUILD_TYPE=Release
.Ссылка на зависимость ExternalProject_add в CMAKE
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
я пытаюсь связать с библиотекой 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")
'ExternalProject_Add' строит проект на этапе сборки **. Но 'FindXXX.cmake' ожидает, что проект XXX будет уже установлен на * этапе конфигурации *. Если вы хотите построить проект на этапе конфигурации, используйте 'execute_process()'. – Tsyvarev
@ Tssyvarev Итак, после многократного поиска я узнал, что все, что мне нужно было сделать, это использовать Unix Makefiles как мои сгенерированные файлы сборки вместо 'Ninja'. Не знаю, почему это так, но это сработало. – BlazePascal