最近构建一个使用protobuf的应用,踩了不少坑,在此记录一下
一、编译protobuf
protobuf只提供源码,没有编译好的库文件给使用造成一定的障碍(差评)。所以c++应用中使用protobuf的第一步是用cmake对protobuf进行构建。
1. 去github官方仓库release页面下载源码
我下载的版本是3.21.9
2. 用Cmake生成VS2022工程,我的配置如下:
3. 用VS2022进行编译,并安装生成的库
用ALL_BUILD项进行编译,用INSTALL项进行安装
安装的时候是在INSTALL项上右键,选择“仅用于项目”->“仅生成INSTALL”,之后会将protobuf的bin、include、lib复制到配置的库安装目录中。
到这一步,protobuf库就准备完毕了,要注意库的编译方式是Debug还是Release。如果是debug方式,生成的库名称叫libprotobufd.lib,对应的dll叫libprotobufd.dll。
二、使用CMake引入protobuf库
需要写CMakeLists.txt引入protobuf,最简单的配置如下:
cmake_minimum_required(VERSION 3.6...3.12 FATAL_ERROR)
project(backend)
# 设置protobuf的库目录
set(CMAKE_PREFIX_PATH "C:/workspace/protobuf")
find_package(Protobuf REQUIRED)
message(STATUS "Protobuf found: ${Protobuf_FOUND}")
message(STATUS "Protobuf version: ${Protobuf_VERSION}")
message(STATUS "Protobuf include dirs: ${Protobuf_INCLUDE_DIRS}")
message(STATUS "Protobuf libraries: ${Protobuf_LIBRARIES}")
# 设置protobuf包含目录
include_directories(${Protobuf_INCLUDE_DIRS})
# 需要定义预处理宏
ADD_DEFINITIONS(-D PROTOBUF_USE_DLLS)
# protobuf生成的c++源文件
aux_source_directory(./proto PROTO_SRCS)
add_executable(main main.cpp ${PROTO_SRCS})
# 链接protobuf
target_link_libraries(main ${Protobuf_LIBRARIES})
这里有几个巨坑的地方。
- find_package找protobuf库的时候必须写出Protobuf,而不是全部小写
- 需要定义预处理宏PROTOBUF_USE_DLLS,不然编译报错
不得不说,C++引入的三方库体验真是差的要死。像前端直接npm install搞定。