私は似たような質問と回答をたくさん見たことがありますが、今まではそれを働かせることはあまり明らかではありません。私はCMakeには新しく、今までプロトコルバッファとの統合を除いてすべてが簡単でした。サブディレクトリ内にprotobufファイルを持つCMake
私は、各サブディレクトリは、サブディレクトリの一つは、.protoファイルが含まれている
CMakeLists.txt
独自のサブディレクトリを持っていたプロジェクトを、持っています。 PROTOBUF_GENERATE_CPPマクロが実行されると、ソースファイルとヘッダーファイルが生成されます。このマクロは、.protoファイルを含むサブディレクトリのCMakeLists.txtから呼び出されます。ただし、ターゲットにソースが追加されていないため、makeファイルは呼び出されないようです。ファイルが存在しない、生成後に存在するので、ターゲットにソースを追加することはできません。そのため、CMakeを実行するとエラーになります。
ファイルのプロパティを生成するように設定しても役立たないようです。一般に、ビルドプロセスが開始する前に、ソースファイルを生成するためにマクロが実行されている必要があります。
どのように実用的な例ですか?
例:./src/generated
./src/externals/protodef(他のリポジトリから、ファイルのみを.proto含有)
(protocによって生成されるCヘッダファイルのために想定)
CMakeLists-1(プロジェクトルート)
cmake_minimum_required (VERSION 2.6)
PROJECT (prototest)
ADD_SUBDIRECTORY("${PROJECT_SOURCE_DIR}/src/externals/protodef")
ADD_SUBDIRECTORY("${PROJECT_SOURCE_DIR}/src")
SET_SOURCE_FILES_PROPERTIES(${PROTO_SOURCES} ${PROTO_HEADERS} PROPERTIES GENERATED TRUE)
ADD_EXECUTABLE(prototest ${PROTO_SOURCES} ${SOURCE})
TARGET_LINK_LIBRARIES(prototest ${EXTERNAL_LIBS})
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
CMakeLists-2(SRC)
SET(SOURCE ${SOURCE}
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
PARENT_SCOPE
)
CMakeLists-3(SRC /外観/ protodef)
SET(PROTOBUF_PATH "D:/protobuf-3.0.0/")
SET(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "${PROTOBUF_PATH}")
# Changing PROTO_SRCS and PROTO_HDRS does not work for setting the location
# of the generated files.
# Those variable are ignored by CMake for compiling the proto files.
# Using a dedicated CMakeLists.txt and settng CURRENT_BINARY dir is a
# workaround to get them where we want.
SET(GENERATED_DIR ${PROJECT_SOURCE_DIR}/src/generated)
SET(CMAKE_CURRENT_BINARY_DIR ${GENERATED_DIR})
INCLUDE(FindProtobuf)
FIND_PACKAGE(Protobuf REQUIRED)
PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS${CMAKE_CURRENT_SOURCE_DIR}/test1.proto)
SET(EXTERNAL_LIBS ${PROTOBUF_PATH}/lib/libprotobuf.a PARENT_SCOPE)
# Propagate sources to the parant project
SET(PROTO_SOURCES ${PROTO_SRCS}
PARENT_SCOPE
)
SET(PROTO_HEADERS ${PROTO_HDRS}
PARENT_SCOPE
)
[MCVE] –
あなたがマークする必要があり投稿してください。生成された.hと.cppファイルはGENERATEDプロパティを持つので、cmakeはそれらを作る時間が来たときにそれらが存在することを知るようにします。 –
@リチャード私はGENERATEDプロパティを設定しようとしました。それは、マクロに渡される変数に "生成される"ファイルのファイル名を埋め込むことだけです。しかしこの場合、ファイルはまだ存在せず、変数にプロジェクトソースファイルを追加すると、存在しないファイルの名前が含まれているため、cmakeエラーが発生します。 – Waldorf