2016-12-25 8 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 не столкнется с этой проблемой.

Угадайте, что причиной может быть неправильная зависимость источника, но как ее исправить?

ответ

0

Если этот фрагмент от субмодуля CMakeLists.txt, не должна 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

Proto path - это опечатка. Есть ли способ (или обходной путь) использовать 'protobuf_generate_cpp' в вложенном проекте? – lz96

+0

@ lz96 Не знаю. – arrowd