2016-06-24 32 views
0

私はこのようになりますCMakeのプロジェクトを持っている:cmakeのは、サブモジュールB内サブモジュールAのヘッダディレクトリが含まれていない

「ライブラリ」サブプロジェクト、Aは、静的ライブラリとしてコンパイルされ
project/ 
    CMakeLists.txt 
    subprojectA/ 
    CMakeLists.txt 
    include/ 
     headerA.hpp 
    src/ 
     libraryA.cpp 
    subprojectB/ 
    CMakeLists.txt 
    src/ 
     mainB.cpp 

、libsubprojectAになります.a。 "main"プロジェクトBはバイナリとしてコンパイルされ、ライブラリに依存します。 mainB.cppにはheaderA.hppへの参照が含まれています。ここで

はsubprojectA/CMakeLists.txtです:

project(SubProjectA) 
include_directories(include) 
add_library(subprojectA STATIC src/libraryA.cpp) 
set(${PROJECT_NAME}_INCLUDE_DIRS 
    ${PROJECT_SOURCE_DIR}/include 
    CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE) 

そして、ここではsubprojectB/CMakeLists.txtです:

project(Project) 
add_subdirectory(subprojectB) 
add_subdirectory(subprojectA) 

project(SubProjectB) 
include_directories(${SubProjectA_INCLUDE_DIRS}) 
add_executable(mainBinary src/mainB.cpp) 
target_link_libraries(mainBinary subprojectA) 

メインプロジェクトCMakeLists.txtは次のようになります

メインプロジェクトのサブプロジェクトBは、の前に表示され、サブprojectA。

ここに問題があります。このプロジェクトで初めてcmakeを実行すると、サブプロジェクトB内で${SubProjectA_INCLUDE_DIRS}が設定されません。

私が考えているのは、${SubProjectA_INCLUDE_DIRS}がまだ設定されていないとき、SubProjectBのCMakeListsが最初に読み込まれるということです。結果として、自身のインクルードパスを空文字列に設定します。ただし、より前にlibsubprojectA.aが正常に構築されても、インクルードパスは事前に空に設定されています。 mainBinaryをしようとしたときに結果として、私はこのエラーを取得する:

subprojectB/src/mainB.cpp:1:23: fatal error: headerA.hpp: No such file or directory 
#include "headerA.hpp" 
        ^

それはCMakeの宣言型の世界における主要プロジェクトCMakeListsにsubprojectB前subprojectAを置くための回避策です。私が本当に望むのは、include_directories(${SubProjectA_INCLUDE_DIRS})の行がSubProjectAのCMakeListsの内部にある定義に依存することをCMakeに指示する適切な方法を知ることです。これを行うより良い方法はありますか?

subprojectA/CMakeLists.txt

答えて

1

あなたがsubprojectAをディレクトリが含まれていることを表現したい場合は/含めるライブラリsubprojectAインタフェースで、target_include_directoriesコマンドを使用してターゲットに、このプロパティを添付:

project(SubProjectA) 
add_library(subprojectA STATIC src/libraryA.cpp) 
# PUBLIC adds both: 
#  1) include directories for compile library and 
#  2) include directories for library's interface 
target_include_directories(subprojectA PUBLIC include) 

したがって、サブプロジェクトにリンクされている実行可能ファイル(または他のライブラリ) CTAが、これは自動的にディレクトリが含まれています:

subprojectB/CMakeLists.txt

もちろん
project(SubProjectB) 
add_executable(mainBinary src/mainB.cpp) 
target_link_libraries(mainBinary subprojectA) 

、使用のために最後のコマンド適切に実行可能と 1前に、ライブラリでディレクトリを処理する必要があります。

CMakeLists。txt

project(Project) 
add_subdirectory(subprojectA) 
add_subdirectory(subprojectB) 
+0

最後の部分は、サブディレクトリへの参照の順序に関して、これの最大の要素です。一般的に宣言的な言語としてのCMakeの設計にもかかわらず、それは正しい順序でなければならない要素がまだあります。だから私は今のところできることは最高だと思う。ありがとう。 –

関連する問題