2016-10-29 7 views
1

Ich erhalte diesen Ninja-Erstellungsfehler, während Ninja läuft. Mein CMAKE-Buildbefehl ist cmake -G"Ninja" -DCMAKE_BUILD_TYPE=Release.Verknüpfung mit einer ExternalProject_add-Abhängigkeit in 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 

Sagen wir, mein Projekt einer API besteht (über CMAKE von GitHub heruntergeladen) und die Durchführung (das Projekt).

The layout would look like: 
Project/ 
-- build/ 
-- cmake/modules 
----- ExternalDep.cmake 
----- FindAPI.cmake 
-- CMakeLists.txt 
-- src/ 
---- CMakeLists.txt 
-- include/ 

Lassen Sie uns sagen, dass in der obersten Ebene CMakeLists.txt ich das übliche Geschäft von Einstellungen bauen Einstellung CXX Flags, et cetera, und dann include(ExternalDep) ich rufe, die überprüft, ob die „API“ Bibliothek im Benutzers ist System (wenn nicht, wird es über CMAKE heruntergeladen). In src/CMakeLists.txt versuche ich, gegen die API-Bibliothek zu verknüpfen einem Ich habe

target_link_libraries(${PROJECT_NAME} PRIVATE ${API_LIBRARY}) 

Die erste Ausgabe ist, dass vor der „API“ Bibliothek auch heruntergeladen und gebaut werden kann, ich den Ninja-Build-Fehler erhalte ich geschrieben über. Ich bin positiv die ExternalDep.cmake ist enthalten, bevor ich versuche, die ausführbare Projektdatei und Link gegen die "API" -Bibliothek hinzuzufügen.

Hier ist eine vereinfachte Version von 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' erstellt das Projekt auf ** build stage **. "FindXXX.cmake" erwartet jedoch, dass das XXX-Projekt bereits auf * configure stage * installiert ist. Wenn Sie ein Projekt zur Konfigurationsphase erstellen möchten, verwenden Sie 'execute_process()'. – Tsyvarev

+0

@Tsyvarev Nachdem ich viel herumgespielt hatte, fand ich heraus, dass ich nur 'Unix-Makefiles' als generierte Build-Dateien anstelle von 'Ninja' verwenden musste. Nicht sicher, warum das so ist, aber es hat funktioniert. – BlazePascal

Antwort

0

ich in der Lage war, dies zu lösen, indem Unix Makefiles erzeugen, statt Ninja. Ich bin mir immer noch nicht ganz sicher, ob das das einzige Problem war, aber es war definitiv eines der Probleme.

4

Ich lief in das gleiche Problem mit Ninja, während es mit Unix Makefiles fein gearbeitet, und ich schaffte es mit Ninja an der Arbeit durch eine BUILD_BYPRODUCTS Linie zu meinem ExternalProject_Add Block hinzugefügt wird. Beispiel:

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) 
Verwandte Themen