2016-03-16 2 views
0

Вот что моя иерархия проекта выглядит (упрощенный):Как правильно импортировать в родительский проект CMake, файл .h, созданный Protobuf, созданный в проекте CMake зависимости?

+-- CMakeLists.txt 
+-- party 
|   +-- CMakeLists.txt 
|   +-- include 
|   \-- src 
|    \-- party.cc 
\-- super 
    +-- CMakeLists.txt 
    +-- include 
    |   \-- super.h 
    \-- src 
     +-- super.cc 
     \-- super.proto 

У меня есть проект библиотеки CMake, называемый Супер, что имеет некоторые Google Protobuf код в нем. Исходный файл, super.proto, используется компилятором protoc для создания super.pb.cc и super.pb.h. Супер-х CMakeLists.txt выглядит следующим образом:

cmake_minimum_required(VERSION 3.1) 
project(Super) 
find_package(Protobuf REQUIRED) 

set(INCLUDE_DIR "include") 
set(SRC_DIR "src") 

add_definitions("-std=c++11") 

include_directories(${CMAKE_CURRENT_BINARY_DIR}) 
include_directories(${INCLUDE_DIR}) 
include_directories(${PROTOBUF_INCLUDE_DIRS}) 

# === Super library === 
PROTOBUF_GENERATE_CPP(super_proto_srcs super_proto_incl ${SRC_DIR}/super.proto) 
file(GLOB shared_srcs "${SRC_DIR}/*.cc") 
add_library(super SHARED ${shared_srcs} ${super_proto_srcs}) 
target_link_libraries(super ${PROTOBUF_LIBRARIES}) 

# === Install and exports === 
set(${PROJECT_NAME}_INCLUDE_DIRS 
    ${PROJECT_SOURCE_DIR}/include 
    CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE) 

Супер должен стать разделяемая библиотека имени libsuper.so. Он имеет файл заголовка, который зависит от super.pb.h.

Сторона является двоичной, которая использует libsuper.so. Он не заботится о Протобуфе, по крайней мере, не напрямую. Он включает в себя super.h и называет его метод. Сторона имеет CMakeLists.txt который выглядит следующим образом:

cmake_minimum_required(VERSION 3.1) 
project(Party) 

set(INCLUDE_DIR "include") 
set(SRC_DIR "src") 

add_definitions("-std=c++11") 

include_directories(${INCLUDE_DIR}) 
include_directories(${Super_INCLUDE_DIRS}) 

# === Party binary === 
file(GLOB binary_srcs "${SRC_DIR}/*.cc") 
add_executable(party ${binary_srcs}) 
target_link_libraries(party super) 

На уровне родительского каталога, объединяющий CMakeLists.txt выглядит следующим образом:

cmake_minimum_required(VERSION 3.1) 
project(SuperParty) 

add_subdirectory(super) 
add_subdirectory(party) 

я могу построить супер сама по себе без каких-либо ошибок , Создаются файлы, созданные Protobuf, также libsuper.so. Однако, когда я пытаюсь построить главный проект, SuperParty, я получаю следующее сообщение об ошибке:

In file included from superparty/party/src/party.cc:1:0: 
superparty/super/include/super.h:1:22: fatal error: super.pb.h: No such file or directory 

файл существует в build/ директории SuperParty, названной build/super/super.pb.h. Моя проблема заключается в том, что мне нужно сказать Стороне, чтобы она включала этот автоматически сгенерированный файл, но я не знаю, где получить путь к этому файлу, чтобы я мог создать соответствующую строку в Party CMakeLists.txt. Стороне эффективно нужна ссылка на CMAKE_BINARY_PATH, которую использует мастер-проект.

ответ

1

Оказывается, существует автоматическая переменная, созданная с именем Super_BINARY_DIR, которую я мог бы использовать в Party CMakeLists.txt, но есть, по сути, еще лучший способ сделать это. Вместо того, чтобы изменять Сторону, которая уже получала свой список включений от Super_INCLUDE_DIRS, я добавил CMAKE_CURRENT_BINARY_DIR в список включений, которые Super создал для использования Стороной. Вот новый финал Супер CMakeLists.txt:

# === Install and exports === 
set(${PROJECT_NAME}_INCLUDE_DIRS 
    ${CMAKE_CURRENT_BINARY_DIR} 
    ${PROJECT_SOURCE_DIR}/include 
    CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)