Вот что моя иерархия проекта выглядит (упрощенный):Как правильно импортировать в родительский проект 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, которую использует мастер-проект.