protobuf cmake

文章讲述了在C++项目中使用protobuf时,两种不同的方法(官方推荐和自定义命令)来处理交叉编译的问题,包括find_package、protobuf生成源码和头文件的步骤,以及如何确保正确链接和编译。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考http://t.csdnimg.cn/vBMdL

交叉编译工具编译的项目不管用!!!因为只能编译,不能运行!

//方法1 官方推荐方法
find_package(Protobuf REQUIRED)
include_directories(${Protobuf_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS foo.proto)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS EXPORT_MACRO DLL_EXPORT foo.proto)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS DESCRIPTORS PROTO_DESCS foo.proto)
protobuf_generate_python(PROTO_PY foo.proto)
add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS})
target_link_libraries(bar ${Protobuf_LIBRARIES})


//方法2 可以放置到任意地方 通过自定义命令 模拟命令行

add_subdirectory(modules)
include_directories(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/modules")

set(Protobuf_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/modules/protobuf/src")
set(Protobuf_LIBRARY "${CMAKE_BINARY_DIR}/modules/protobuf/libprotobuf.a")
set(PROTOC_EXECUTABLE "${CMAKE_BINARY_DIR}/modules/protobuf/protoc")

find_package(Protobuf 3.21.4 REQUIRED)
include_directories(${Protobuf_INCLUDE_DIRS})
# include_directories(${CMAKE_CURRENT_BINARY_DIR})

message("========================Protobuf check======================")
# 如果找到 Protobuf 库,输出库和包括目录信息
if(Protobuf_FOUND)
  message(STATUS "Protobuf version: ${Protobuf_VERSION}")
  message(STATUS "Protobuf include path: ${Protobuf_INCLUDE_DIRS}")
  message(STATUS "Protobuf libraries: ${Protobuf_LIBRARIES}")
  message(STATUS "Protoc complier: ${PROTOBUF_PROTOC_EXECUTABLE}")
  message("CMAKE_BINARY_DIR = ${CMAKE_BINARY_DIR}")
  message("PROTOC_EXECUTABLE = ${PROTOC_EXECUTABLE}")
else()
  message(FATAL_ERROR "Protobuf not found")
endif()

# Proto 文件路径
set(PROTO_FILE "${CMAKE_CURRENT_SOURCE_DIR}/protoMessage/header.proto")
# 输出目录
set(PROTO_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/protoMessage")
# 生成源文件和头文件的路径
set(PROTO_SRCS "${PROTO_OUTPUT_DIR}/header.pb.cc")
set(PROTO_HDRS "${PROTO_OUTPUT_DIR}/header.pb.h")
# 执行 protoc
add_custom_command(
  OUTPUT "${PROTO_SRCS}" "${PROTO_HDRS}"
  COMMAND ${PROTOC_EXECUTABLE}
  ARGS --cpp_out=${PROTO_OUTPUT_DIR} --proto_path=${CMAKE_CURRENT_SOURCE_DIR}/protoMessage ${PROTO_FILE}
  DEPENDS ${PROTO_FILE}
  COMMENT "Running C++ protocol buffer compiler with ${PROTOC_EXECUTABLE}"
  VERBATIM
)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值