2016-10-29 10 views
1

Ninjaの実行中にこの忍者構築エラーが発生しました。私のCMAKEビルドコマンドはcmake -G"Ninja" -DCMAKE_BUILD_TYPE=Releaseです。CMAKEのExternalProject_add依存関係へのリンク

ninja: error: 'ext_deps/api/src/ext_api/build/src/lib/libapi.a', needed by 'Project', missing and no known rule to make it 

のは、私のプロジェクトは、(GitHubのからCMAKE経由でダウンロード)APIと実装(プロジェクト)で構成されて言ってみましょう。

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ライブラリとリンクしよう上記。私はプロジェクトの実行可能ファイルと "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'は、* configureステージ*に既にXXXプロジェクトがインストールされていることを期待しています。 configure段階でプロジェクトをビルドしたい場合は 'execute_process()'を使います。 – Tsyvarev

+0

@Tsyvarevだから私は、「忍者」の代わりに 'Unix Makefiles'を私の生成したビルドファイルとして使うだけで済むということを知りました。なぜこれが当てはまるのか分かりませんが、うまくいきました。 – BlazePascal

答えて

0

私が代わりに忍者のUnixののMakefileを生成することによって、この問題を解決することができた:

はここExternalDep.cmakeの簡易版です。私はこれが単なる問題であるかどうかはまだ分かりませんが、それは間違いなく問題の1つでした。

4

それはUnix Makefilesでうまく働いている間、私はNinjaと同じ問題に走った、と私はそれが私のExternalProject_AddブロックにBUILD_BYPRODUCTSの行を追加してNinjaで動作するように得ることができました。例:

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) 
関連する問題