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")
'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
@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