2016-12-25 5 views
0

Struktur Projekt:CMake: falsche Zusammenstellung Reihenfolge: generate_protobuf_cpp in Submodul

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

CMakeLists.txt (Modul):

################################## 
# 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 (root)

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

# And other sources... 

Das Submodul selbst kompiliert gut . Aber wenn ich es als Submodul von Root-Projekt einschließe. make -j4 ergäbe:

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

Seltsam, wenn ich make -j4 wieder laufen, nachdem er scheiterte [ 33%] Running C++ protocol buffer compiler on src/protos/message.proto korrekt aufgerufen werden würde, und binäre könnte ohne Probleme erzeugt werden. make -j2 oder make wird dieses Problem nicht haben.

Raten Sie, der Grund könnte falsche Quellenabhängigkeit sein, aber wie kann man das beheben?

Antwort

0

Wenn dieser Ausschnitt aus Submodul CMakeLists.txt ist, sollte nicht protobuf Linie

protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS protos/message.proto) 

sein, wenn Sie diese Zeile in Mutter CMakeLists.txt haben, dann ist dies wahrscheinlich die Ursache des Problems ist. Dokumentation für FindProtobuf.cmake Staaten

Die protobuf_generate_cpp und protobuf_generate_python Funktionen und add_executable() oder add_library() eigentlich nur Anrufe arbeiten im gleichen Verzeichnis.

+0

Proto Pfad ist ein Tippfehler. Gibt es eine Möglichkeit (oder Workaround), 'protobuf_generate_cpp' im verschachtelten Projekt zu verwenden? – lz96

+0

@ lz96 Ich bin mir dessen nicht bewusst. – arrowd

Verwandte Themen