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