2016-12-25 18 views
0

プロジェクト構造:CMakeの:間違ったコンパイル順序:サブモジュールでgenerate_protobuf_cpp

/ 
|--- src/ 
    |--- *.cpp 
|--- CMakeLists.txt (root) 
|--- vendor/ 
    |--- submodule 
      |--- protos 
       |--- message.proto 
      |--- src 
       |--- *.cpp (#include "message.pb.h") 
      |--- CMakeLists.txt (submodule) 

CMakeLists.txt(サブモジュール):

################################## 
# Message protos 
################################## 
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS protos/message.proto) 
include_directories(${CMAKE_CURRENT_BINARY_DIR}) 

################################## 
# submodule 
################################## 
include_directories(src/) 
set(submodule_SRC src/foobar.cpp ${PROTO_SRCS} ${PROTO_HDRS}) 
add_library(submodule STATIC ${submodule_SRC}) 
target_link_libraries(goboard ${PROTOBUF_LIBRARIES}) 
set(submodule_INCLUDE_DIR ${Protobuf_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE) 

CMakeLists.txt(ルート)

add_subdirectory(${root_SOURCE_DIR}/vendor/submodule) 
include_directories(${submodule_INCLUDE_DIR}) 

# And other sources... 

サブモジュール自体はうまくコンパイル。しかし、それをルートプロジェクトのサブモジュールとして含めると、 make -j4がもたらすであろう:

vendor/submodule/foobar.cpp: fatal error: 'message.pb.h' file not found 
#include "message.pb.h" 

を不思議なことに、私はmake -j4を実行する場合、それが失敗した後、再び、[ 33%] Running C++ protocol buffer compiler on src/protos/message.protoが正しく呼び出されることになるとバイナリは問題なく生成することができます。 make -j2またはmakeはこの問題に直面しません。

理由はソースの依存関係が間違っているかもしれないと思いますが、それを修正する方法は?このスニペットは、サブモジュールCMakeLists.txtからのものである場合

答えて

0

は、いるProtobufラインは

protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS protos/message.proto) 

すべきではない、あなたが親CMakeLists.txtにそのラインを持っている場合、これはおそらく問題の原因です。 FindProtobuf.cmake状態

protobuf_generate_cppとprotobuf_generate_python機能やadd_executable()またはadd_libraryのドキュメントは()のみ同じディレクトリ内正しく動作呼び出します。

+0

プロトパスはタイプミスです。ネストされたプロジェクトで 'protobuf_generate_cpp'を使用する方法(または回避策)はありますか? – lz96

+0

@ lz96わかっていません。 – arrowd

関連する問題