簡體   English   中英

如何將在依賴CMake項目中創建的Protobuf生成的.h文件正確導入到父CMake項目中?

[英]How do I properly import, into a parent CMake project, a Protobuf-generated .h file created in a dependency CMake project?

這是我的項目層次結構(簡化):

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

我有一個名為Super的庫CMake項目,其中包含一些Google Protobuf代碼。 super.proto編譯器使用源文件super.proto來創建super.pb.ccsuper.pb.h Super的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)

Super將成為名為libsuper.so的共享庫。 它具有一個依賴於super.pb.h的頭文件。

Party是使用libsuper.so的二進制文件。 它並不關心Protobuf,至少不是直接關心。 它包含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)

我可以自己構建Super,而不會出錯。 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

該文件位於SuperParty的build/目錄中,稱為build/super/super.pb.h 我的問題是我需要告訴Party包含此自動生成的文件,但是我不知道從何處獲取該文件的路徑,以便可以在Party的CMakeLists.txt創建適當的行。 參與方實際上需要引用主項目正在使用的CMAKE_BINARY_PATH。

事實證明,可以在Party的CMakeLists.txt使用一個名為Super_BINARY_DIR的自動變量,但實際上,還有一種更好的方法。 我沒有修改Party,后者已經從Super_INCLUDE_DIRS獲取了它的包含列表,而是向該Super創建供Party使用的包含列表中添加了一個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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM