文章目录
- 概要
- 整体架构流程
- 代码
- 优化
概要
protobuf的安装与用cmake编译protobuf程序
整体架构流程
安装protobuf3 21.12,最新版本好像要用到一个新的库,有点麻烦。
https://github.com/protocolbuffers/protobuf/releases/tag/v21.12
all和cpp后缀的包都可以下载
# 第一步如果下载的是all缀的包执行
./autogen.sh #如果是其他具体语言的包就不用
# 第二步
./configure #方式1,若执行该命令 protobuf会默认安装在/usr/local 下
./configure --prefix=/usr/local/protobuf #方式2,若执行该命令会将protobuf的bin,lib都一起放在指定的目录下
#第三步
make #时间有点久
make check #时间有点久
sudo make install
提示:如果是直接.configure 安装应该cmake可以直接find_package(Protobuf REQUIRED) 找到,本文中的方法是用的第二种带--prefix的方法
第一种方式安装可以直接protoc --version 查看版本使用
如果是第二种方法:
#linux 修改bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
export PATH=$PATH:/usr/local/protobuf/bin/
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
#mac
vim ~/.bash_profile
export PROTOBUF=/usr/local/protobuf
export PATH=$PROTOBUF/bin:$PATH
#然后
source .bash_profile
提示:Mac系统的环境变量,加载顺序为: /etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc
执行 protoc --version
代码
contacts.proto文件
syntax = "proto3";
package contacts;
message People{
string name = 1;
int32 age = 2;
}
执行protoc --cpp_out . contacts.proto
生成proto对应的源码
#main.cc
#include <iostream>
#include "contacts.pb.h"
int main(){
std::string people_str;
contacts::People people1;
people1.set_name(" test_name ");
people1.set_age(10);
if(!people1.SerializeToString(&people_str)){
std::cout<< "序列化失败" <<std::endl;
}
std::cout<< "序列化成功: " << people_str << std::endl;
contacts::People people2;
if (!people2.ParseFromString(people_str)){
std::cout<< "反序列化失败!" << std::endl;
}
std::cout<< " 反序列化成功!" << std::endl;
std::cout<< "name: " << people2.name()
<< " age: " << people2.age() <<std::endl;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.5) # cmake最低版本
project(demo_project) #项目名称
set(CMAKE_CXX_STANDARD 11) #设置C++编译版本
set(CMAKE_BUILD_TYPE "Debug") # 默认是Release模式,设置为Debug才能调试
# 设置Protobuf的路径
set(PROTOBUF_PATH /usr/local/protobuf)
# 设置Protobuf的头文件和库文件路径
include_directories(${PROTOBUF_PATH}/include)
link_directories(${PROTOBUF_PATH}/lib)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) #设置可执行文件生产的路径
aux_source_directory(. SRC_LISTS) #.下所有的cpp文件打包到变量SRC_LISTS中
add_executable(demo ${SRC_LISTS}) #生成可执行文件demo
# 链接Protobuf库
target_link_libraries(demo protobuf)
run.sh
#bin/bash
mkdir -p build
cd build
cmake ..
make
cd ..
./bin/demo
优化
之前我们需要手动生成proto源文件,现在我们来用cmake自动生成
新的CMakeLists.txt
cmake_minimum_required(VERSION 3.5) # cmake最低版本
project(demo_project) #项目名称
set(CMAKE_CXX_STANDARD 11) #设置C++编译版本
set(CMAKE_BUILD_TYPE "Debug") # 默认是Release模式,设置为Debug才能调试
set(CMAKE_PREFIX_PATH "/usr/local/protobuf")
find_package(Protobuf REQUIRED)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS contacts.proto)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) #设置可执行文件生产的路径
aux_source_directory(. SRC_LISTS) #.下所有的cpp文件打包到变量SRC_LISTS中
add_executable(demo ${SRC_LISTS} ${PROTO_SRCS} ${PROTO_HDRS} ) #生成可执行文件demo
# 链接Protobuf库
# target_link_libraries(demo protobuf)
target_include_directories(demo PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(demo protobuf::libprotobuf)