带有Google协议缓冲区的CMake

杜特

我正在尝试使用cmake使用协议缓冲区来构建我的小项目。

有一个带有许多子目录的根目录,这些子目录具有许多库和可执行文件。我的第一个念头是将.proto文件放在子目录中,但是当我阅读此答案时,我改为使用创建一个库。但是,当我尝试在可执行文件中包含message标头时,找不到它。

错误信息:

fatal error: msgs.pb.h: No such file or directory
 #include "msgs.pb.h"
                     ^
compilation terminated.

我通过创建目录“ build”,然后从其内部创建“ cmake .. && make”来运行它。我已经看过了,似乎生成的文件放在了build / messages中,所以我可以做include_directories(build / messages),但这似乎不对。使用protobuf是否有适当的方法?我希望消息文件位于其自己的文件夹中的原因是,它们将在许多不同的小型可执行文件中使用。

任何其他改进我的CMake结构的通用技巧也将受到赞赏:)

目录:

root
   messages
   core
   server

根目录/CMakeLists.txt:

project(lillebror)
cmake_minimum_required(VERSION 2.8)
cmake_policy(SET CMP0015 NEW)

set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost COMPONENTS date_time log thread system)
find_package(Protobuf REQUIRED)
if(Boost_FOUND)
    add_definitions(-std=c++11)
    add_subdirectory(messages)
    add_subdirectory(core)
    add_subdirectory(server)
    add_subdirectory(testserver)
endif()

messages / CMakeLists.txt:

file(GLOB ProtoFiles "${CMAKE_CURRENT_SOURCE_DIR}/*.proto")
PROTOBUF_GENERATE_CPP(ProtoSources ProtoHeaders ${ProtoFiles})
add_library(messages STATIC ${ProtoSources} ${ProtoHeaders})
target_link_libraries(messages ${Boost_LIBRARIES} ${PROTOBUF_LIBRARY})

core / CMakeLists.txt:

aux_source_directory(src SRC_LIST)
add_library(core STATIC ${SRC_LIST})
target_link_libraries(core messages ${Boost_LIBRARIES})

服务器/CMakeLists.txt:

aux_source_directory(src SRC_LIST)
include_directories(../messages) <---- I thought this would sove my problem
include_directories(../core/src)
link_directories(../core/build)
add_executable(server ${SRC_LIST})
target_link_libraries(server core ${Boost_LIBRARIES})

服务器/ main.cpp:

#include "msgs.pb.h"
int main()
{
    return 0;
}
弗雷泽

我认为这里的问题是该PROTOBUF_GENERATE_CPP函数将.pb.h和.pb.cc文件设置为存在于生成树中,而不存在于源代码树中。

这是一个好习惯(不污染源树),但是这意味着您的呼叫include_directories(../messages)正在向搜索路径添加错误的值。这将添加源目录“ root / messages”,而您需要“ [build root] / messages”。

您可能只需将该行替换为:

include_directories(${CMAKE_BINARY_DIR}/messages)

但是,更健壮,更易于维护的方法可能是在messages / CMakeLists.txt中设置所需的包含路径。要将此值公开给父范围,需要使用set(... PARENT_SCOPE)或:

set(ProtobufIncludePath ${CMAKE_CURRENT_BINARY_DIR}
    CACHE INTERNAL "Path to generated protobuf files.")

然后,在顶层CMakeLists.txt中,您可以执行以下操作:

include_directories(${ProtobufIncludePath})

如果您的messages库本身需要#include生成的protobuf文件(这是正常的),那么它也应该具有类似的include_directories调用。

综上所述,如果您可以将CMake v2.8.12指定为最小值,则可以改用target_include_directories命令。

add_library调用后在messages / CMakeLists.txt中,您只需执行以下操作:

target_include_directories(messages PUBLIC ${CMAKE_CURRENT_BINARY_DIR})

然后,任何其他依赖于目标的目标都会messages自动添加适当的“消息”,包括添加目录-您根本不需要显式调用include_directories

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有Google协议缓冲区的CMake

来自分类Dev

带有协议缓冲区的RPC

来自分类Dev

带有CMakeLists的协议缓冲区

来自分类Dev

带有和不带有协议缓冲区的Google Cloud Datastore

来自分类Dev

带有协议缓冲区的程序无法链接

来自分类Dev

发送带有协议缓冲区的已定义对象列表

来自分类Dev

带有协议缓冲区的ASP.NET WebApi-错误处理

来自分类Dev

C ++中的Google协议缓冲区:从现有结构创建消息

来自分类Dev

Google的协议缓冲区会自动有效地对齐数据吗?

来自分类Dev

无法获取Google协议缓冲区进行编译

来自分类Dev

纯虚拟方法称为错误Google协议缓冲区

来自分类Dev

Golang Google协议缓冲区中的错误

来自分类Dev

微软的Bond和Google的协议缓冲区之间的区别

来自分类Dev

未定义的参考Google协议缓冲区类

来自分类Dev

C ++ Google协议缓冲区打开http套接字

来自分类Dev

从套接字转换(解析)Google协议缓冲区流

来自分类Dev

带反射的嵌套协议缓冲区

来自分类Dev

Java协议缓冲区-反射

来自分类Dev

在C ++中解析协议缓冲区

来自分类Dev

Scala Akka和协议缓冲区

来自分类Dev

协议缓冲区Wireshark插件

来自分类Dev

改善协议缓冲区的性能

来自分类Dev

协议缓冲区消息的字节序

来自分类Dev

协议缓冲区:版本更改

来自分类Dev

REST是否支持协议缓冲区

来自分类Dev

损坏的协议缓冲区消息

来自分类Dev

协议缓冲区-分配嵌套消息

来自分类Dev

Ionic 4协议缓冲区

来自分类Dev

协议缓冲区损坏数据