2016-10-29 2 views
1

Я получаю эту ошибку строчки 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") 
+1

'ExternalProject_Add' строит проект на этапе сборки **. Но 'FindXXX.cmake' ожидает, что проект XXX будет уже установлен на * этапе конфигурации *. Если вы хотите построить проект на этапе конфигурации, используйте 'execute_process()'. – Tsyvarev

+0

@ Tssyvarev Итак, после многократного поиска я узнал, что все, что мне нужно было сделать, это использовать Unix Makefiles как мои сгенерированные файлы сборки вместо 'Ninja'. Не знаю, почему это так, но это сработало. – BlazePascal

ответ

0

Я был в состоянии решить эту проблему путем создания Unix Makefiles вместо Ninja. Я все еще не совсем уверен, что это единственная проблема, но это определенно одна из проблем.

4

Я столкнулся с той же проблемой с 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) 
Смежные вопросы