2017-01-02 7 views
0

私は似たような質問と回答をたくさん見たことがありますが、今まではそれを働かせることはあまり明らかではありません。私は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 
) 
+0

[MCVE] –

+0

あなたがマークする必要があり投稿してください。生成された.hと.cppファイルはGENERATEDプロパティを持つので、cmakeはそれらを作る時間が来たときにそれらが存在することを知るようにします。 –

+0

@リチャード私はGENERATEDプロパティを設定しようとしました。それは、マクロに渡される変数に "生成される"ファイルのファイル名を埋め込むことだけです。しかしこの場合、ファイルはまだ存在せず、変数にプロジェクトソースファイルを追加すると、存在しないファイルの名前が含まれているため、cmakeエラーが発生します。 – Waldorf

答えて

0

まずCMakeのターゲットにそれらを追加し、いるProtobufファイルを生成します。

CMakeLists(SRC):

# Generate h/cpp proto files (./src/externals/protodef) into ./src/generated folder 
PROTOBUF_GENERATE_CPP(...) 

# Process subdir 
ADD_SUBDIRECTORY(generated) 

PROTOBUF_GENERATE_CPPが同じサブディレクトリにのみ使用することができるようです。

FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/externals/protodef PROTOMODEL_PATH) 
FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/generated PROTOBINDING_PATH) 

FILE(GLOB DATAMODEL_PROTOS "${CMAKE_CURRENT_SOURCE_DIR}/externals/protodef/*.proto") 

FOREACH(proto ${DATAMODEL_PROTOS}) 
    FILE(TO_NATIVE_PATH ${proto} proto_native) 
    EXECUTE_PROCESS(COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --proto_path=${PROTOMODEL_PATH} --cpp_out=${PROTOBINDING_PATH} ${proto_native} 
    RESULT_VARIABLE rv) 
    # Optional, but that can show the user if something have gone wrong with the proto generation 
    IF(${rv}) 
     MESSAGE("Generation of data model returned ${rv} for proto ${proto_native}") 
    ENDIF() 
ENDFOREACH(proto) 

CMakeLists(srcは/発生):

## List generated sources files 
FILE(GLOB HDRS "*.h") 
FILE(GLOB SRCS "*.cc") 

ADD_LIBRARY(protoBinding ${HDRS} ${SRCS}) 
# ${PROTOBUF_LIBRARIES} should be defined by FIND_PACKAGE(Protobuf REQUIRED) 
TARGET_LINK_LIBRARIES(protoBinding ${PROTOBUF_LIBRARIES}) 

CMakeの最初のヘッダ/ソースファイルを生成し、そしてのみ次いで生成されたファイルを追加します。この方法の可能な回避策は、代わりに、直接protocを呼び出すことですCMakeターゲットに転送します。

あなたはその後、(例えば srcのCMakeLists.txtの終わりに)他のターゲットに生成されたファイルをリンクする protoBindingターゲットを使用することができます

ADD_LIBRARY(myModel ${myFiles}) 
TARGET_LINK_LIBRARIES(myModel protoBinding) 
+0

もう少しコントロールできる2番目のオプションを使用しました。それは魅力のように働く。 私の場合、PROTOBUF_LIBRARIESがlibprotobuf.dll.aを指し示しています libprotobufとGoogleが推奨するように静的にリンクしたいと思います。現在私はlibを手作業で設定していますが、おそらくもっときれいな方法があります。 – Waldorf

関連する問題