ubuntu22.04安装使用 protobuf 23.3静态库

news2024/11/17 0:00:29

https://github.com/protocolbuffers/protobuf/

下载最新的release版本,23.3

必须需要依赖的第三方库 abseil,utf8_range

mkdir build

cd build

cmake -DCMAKE_BUILD_TYPE=DEBUG  -DCMAKE_INSTALL_PREFIX=/usr/local -Dprotobuf_BUILD_SHARED_LIBS=OFF -Dprotobuf_WITH_ZLIB=OFF -Dprotobuf_BUILD_TESTS=OFF ..

make

sudo make install

或直接修改CmakeList.txt 添加/修改以下内容

set(protobuf_VERBOSE ON) #debug信息
set(protobuf_BUILD_TESTS  OFF)#不编译test
set(protobuf_WITH_ZLIB  OFF)  #不使用zlib
set(protobuf_WITH_ZLIB_DEFAULT OFF)#不使用zlib
set(protobuf_BUILD_SHARED_LIBS  OFF)#静态库
set(protobuf_BUILD_SHARED_LIBS_DEFAULT  OFF)#静态库
set(CMAKE_INSTALL_PREFIX /usr/local)#安装路径

如果要建立动态库,依赖的abseil 最好也是动态库.

安装后使用的方法,在target_link_libraries里,需要先写protobuf,然后rtf8_range,最后才是absl。 顺序不可以改变,因为protobuf要依赖后两个,rtf8_range要依赖absl

目录结构

 cmakeList.txt

absl把所有的都一起贴上了

cmake_minimum_required(VERSION 3.19)
project(protobut_demo)

set(CMAKE_CXX_STANDARD 17)

include_directories(/usr/local/include)
#------------------------------------------------------------------
find_package(Protobuf REQUIRED)
include_directories(${Protobuf_INCLUDE_DIRS})
#${Protobuf_LIBRARIES}
#检查是否有值
MESSAGE("Protobuf lib path :" ${Protobuf_LIBRARIES})
MESSAGE("Protobuf include path:" ${Protobuf_INCLUDE_DIRS})
MESSAGE("Protobuf exetuable path:" ${PROTOBUF_PROTOC_EXECUTABLE})

# proto源文件位置
SET(PROTO_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/proto)

# proto 文件生成位置,包含.pb.cc 和 .pb.h
SET(PROTO_OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/proto_output)

# proto 文件
file(GLOB proto_files
        ${CMAKE_CURRENT_SOURCE_DIR}/proto/*.proto
        )
# 生成文件
FOREACH(PROTO_FILE ${proto_files})
    EXECUTE_PROCESS(
            COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} -I${PROTO_SOURCE_DIR} --cpp_out=${PROTO_OUTPUT_DIR} ${PROTO_FILE}
    )
ENDFOREACH()
#---------------------------------------------------------------------------------------------
include_directories(${PROTO_OUTPUT_DIR})#生成的头文件路径

# 将proto生成的.pb.cc 和 .pb.h分类

file(GLOB contacts_All
        ${PROTO_OUTPUT_DIR}/*.pb.h
        ${PROTO_OUTPUT_DIR}/*.pb.cc
        )
find_package(absl)
find_package(utf8_range)

add_executable(proto_test src/proto_test.cpp ${contacts_All})
target_link_libraries(proto_test
        ${Protobuf_LIBRARIES}

        /usr/local/lib/libutf8_range.a
        /usr/local/lib/libutf8_validity.a

        absl::bad_any_cast_impl
        absl::bad_optional_access
        absl::bad_variant_access
        absl::base
        absl::city
        absl::civil_time
        absl::cord
        absl::cord_internal
        absl::cordz_functions
        absl::cordz_handle
        absl::cordz_info
        absl::cordz_sample_token
        absl::crc32c
        absl::crc_cord_state
        absl::crc_cpu_detect
        absl::crc_internal
        absl::debugging_internal
        absl::demangle_internal
        absl::die_if_null
        absl::examine_stack
        absl::exponential_biased
        absl::failure_signal_handler
        absl::flags
        absl::flags_commandlineflag
        absl::flags_commandlineflag_internal
        absl::flags_config
        absl::flags_internal
        absl::flags_marshalling
        absl::flags_parse
        absl::flags_private_handle_accessor
        absl::flags_program_name
        absl::flags_reflection
        absl::flags_usage
        absl::flags_usage_internal
        absl::graphcycles_internal
        absl::hash
        absl::hashtablez_sampler
        absl::int128
        absl::kernel_timeout_internal
        absl::leak_check
        absl::log_entry
        absl::log_flags
        absl::log_globals
        absl::log_initialize
        absl::log_internal_check_op
        absl::log_internal_conditions
        absl::log_internal_format
        absl::log_internal_globals
        absl::log_internal_log_sink_set
        absl::log_internal_message
        absl::log_internal_nullguard
        absl::log_internal_proto
        absl::log_severity
        absl::log_sink
        absl::low_level_hash
        absl::malloc_internal
        absl::periodic_sampler
        absl::random_distributions
        absl::random_internal_distribution_test_util
        absl::random_internal_platform
        absl::random_internal_pool_urbg
        absl::random_internal_randen
        absl::random_internal_randen_hwaes
        absl::random_internal_randen_hwaes_impl
        absl::random_internal_randen_slow
        absl::random_internal_seed_material
        absl::random_seed_gen_exception
        absl::random_seed_sequences
        absl::raw_hash_set
        absl::raw_logging_internal
        absl::scoped_set_env
        absl::spinlock_wait
        absl::stacktrace
        absl::status
        absl::statusor
        absl::strerror
        absl::str_format_internal
        absl::strings
        absl::strings_internal
        absl::symbolize
        absl::synchronization
        absl::throw_delegate
        absl::time
        absl::time_zone
        )





student.proto

syntax = "proto3";
package student;

// 定义联系人message
message StudentInfo {
  string name = 1;
  bool isMale = 2;
  int32 age = 3;
}

student.pb.cc和student.pb.h 是用cmake生成的

proto_test.cpp

#include <iostream>
#include "student.pb.h"

#include <google/protobuf/compiler/plugin.h>

int main(int argc,char** argv) {
    std::string data_str;

    {
//         使⽤ PB 进⾏序列化,并将结果打印出来。
        student::StudentInfo _student;
        _student.set_name("小豪豪");
        _student.set_ismale(true);
        _student.set_age(20);

        if (!_student.SerializeToString(&data_str)) {
            std::cerr << "序列化_student失败!" << std::endl;
            return -1;
        }
        std::cout << "序列化_student成功,结果:" << data_str << std::endl;
    }

    {
        // 使⽤ PB 进⾏反序列,解析出联系⼈信息并打印出来。
        student::StudentInfo _student;
        if (!_student.ParseFromString(data_str)) {
            std::cerr << "反序列化失败!" << std::endl;
            return -1;
        }
        std::cout << "反序列化成功!" << std::endl;
        std::cout << "name:" << _student.name() << std::endl;
        std::cout << "ismale:" << _student.ismale() << std::endl;
        std::cout << "age:" << _student.age() << std::endl;
    }

    return 0;
} //
// Created by hao on 2023/6/26.
//

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式(二十一)——模板模式(Template )

设计模式&#xff08;二十一&#xff09;——模板模式 理解 模板模式&#xff0c;我的理解是父类中有操作的流程已经确定&#xff0c;但是没有具体的实现&#xff0c;实现可以在子类中实现&#xff0c;但是流程已经确定&#xff0c;只要在父类中实现一次即可。 应用场景 学…

PC: 市场寒冬剖析

市场调研机构Canalys数据显示&#xff0c;今年一季度&#xff0c;中国市场整体PC出货量同比下降24%至890万台&#xff0c;已是连续第五个季度下跌。今年截至618结束&#xff0c;都没有一家主要的PC厂商愿意发战报。PC市场怎样走出寒冬&#xff1f;谈谈你的理解和看法。 PC 一、…

分布式软件架构——分布式事务TCC和SAGA

TCC事务 TCC 是另一种常见的分布式事务机制&#xff0c;它是“Try-Confirm-Cancel”三个单词的缩写&#xff0c;是由数据库专家 Pat Helland 在 2007 年撰写的论文《Life beyond Distributed Transactions: An Apostate’s Opinion》中提出。 前面介绍的可靠消息队列虽然能保…

【软件安装】Linux系统中安装Redis缓存数据库(Ubuntu系统)

这篇文章&#xff0c;主要介绍Linux系统中安装Redis缓存数据库&#xff08;Ubuntu系统&#xff09;。 目录 一、Linux安装Redis数据库 1.1、下载Redis安装包 1.2、解压Redis安装包 1.3、编译Redis源代码 1.4、安装Redis服务 1.5、启动Redis服务 一、Linux安装Redis数据库…

免费沉浸式Twitter翻译工具 用AI打破语言障碍

语言对于人类社交而言是至关重要的。它是连接不同文化、不同国家、不同民族之间的桥梁。然而&#xff0c;在全球化进程加速的今天&#xff0c;不同语言之间的交流障碍成为了一个限制人类沟通的因素。尤其是在互联网时代&#xff0c;我们需要跨越各种语言屏障才能获取信息和与他…

【Jetson Xavier NX 开发板深度学习环境和ROS配置流程】

【Jetson Xavier NX 开发板深度学习环境和ROS配置流程】 1.基本介绍2. 预先准备3. NX系统基本环境搭建3.1 安装 NVIDIA SDK管理器3.2 准备硬件3.3 NX刷机3.3.1 配置开发环境3.3.2 查看组件并接受许可3.3.3 开始安装 3.4 设置SSD启动3.4.1 设置您已安装的SSD3.4.2 将根源从eMMC复…

do-while(0)语句到底有什么用?

前言 在一个群里面看到一个人问&#xff0c;do-while(0)语句有什么用&#xff1f;do-while(0)这个程序最终结果不应该就是程序只跑一次&#xff0c;那么写和不写有什么区别呢&#xff1f; do-while(0)在复杂宏定义上的优点 为什么需要复杂宏 &#xff08;1&#xff09;在讲解d…

tinyxml2.cpp:(.text+0x71e8): undefined reference to `stdout

-target aarch64-linux-android21 > -target aarch64-linux-android24 问题解决 修改QT配置&#xff0c;默认为21改为24 &#xff0c;因为stdout stdin stderr 在android23之后才实现 编译成功&#xff0c;问题解决

C语言——详解函数栈帧的创建和销毁

函数栈帧 前言&#xff1a;一、认识相关寄存器和汇编指令1.寄存器&#xff08;寄存器是集成在cpu上的&#xff09;2.汇编指令 二、函数栈帧创建和销毁的过程1.main函数的调用2.函数栈帧的创建3.函数栈帧的销毁 前言&#xff1a; 为了深入学习C语言&#xff0c;也为了方便理解&…

仅在python虚拟环境中安装CUDA、CUDNN、PaddlePaddle-gpu

0、前言 在配置深度学习环境时&#xff0c;若想使用GPU加速&#xff0c;就需要安装CUDA、CUDNN&#xff0c;然而在系统中安装的话&#xff0c;若不同框架需要的版本不同&#xff0c;就会比较麻烦。因此&#xff0c;一种比较方便的做法是&#xff1a;利用conda管理不同的python…

arcgis实现DEM镶嵌和去白点

目录 镶嵌去白点 镶嵌 arcgis中直接选择镶嵌就行&#xff0c;然后选择其中一幅进行输出就好 去白点 镶嵌好之后&#xff0c;就会出现白色的&#xff0c;好像没有数据&#xff0c;为nodata 解决办法&#xff1a;可以使用arcgis中的焦点统计&#xff0c;计算邻域进行插值&…

terser用于ES6的压缩JS工具

https://www.npmjs.com/package/terser uglify-es不再维护&#xff0c;uglify-js也不支持ES6。 terser是uglify-es的一个分支&#xff0c;主要保留了与uglify和uglify-js3. npm install terser -gterser [input files] [options] terser-webpack-plugin 使用terser-webpack-pl…

生成式 AI 将如何颠覆数据分析?

生成式 AI 对数据分析的颠覆式变革 想象这样一个场景&#xff0c;您能够像与人交谈一样和计算机进行交流。在这个场景中&#xff0c;您不需要学习复杂的技术&#xff0c;通过自然语言就能够整理数据、分析复杂的数据集、并生成报告。几年前&#xff0c;这可能还是科幻小说中的画…

手把手教你实现SpringBoot的监控!

任何一个服务如果没有监控&#xff0c;那就是两眼一抹黑&#xff0c;无法知道当前服务的运行情况&#xff0c;也就无法对可能出现的异常状况进行很好的处理&#xff0c;所以对任意一个服务来说&#xff0c;监控都是必不可少的。 就目前而言&#xff0c;大部分微服务应用都是基…

【C#】并行编程实战:实现数据并行(1)

本教程对应学习工程&#xff1a;魔术师Dix / HandsOnParallelProgramming GitCode 到目前为止&#xff0c;我们已经掌握了并行编程、任务和任务并行的基础知识。本章将讨论并行编程的另一个重要方面&#xff0c;即数据并行。 任务并行可以为每个参与线程创建一个单独的…

SpringSecurity认证流程(超级详细)

1 .前言 最近开发项目的时候遇到了和SpringSecurity相关的一些问题&#xff0c;但是之前并没有去了解过SpringSecurity&#xff0c;导致改系统安全权限验证的时候就比较吃力了&#xff0c;目前项目开发大多都直接用脚手架直接开发&#xff0c;系统安全权限验证已经形成了&…

漏洞复现|和信创天云桌面系统存在任意文件上传目录遍历漏洞

一、 阅读须知 一切从降低已有潜在威胁出发&#xff0c;所有发布的技术文章仅供参考&#xff0c;未经授权请勿利用文章中的技术内容对任何计算机系统进行入侵操作&#xff0c;否则对他人或单位而造成的直接或间接后果和损失&#xff0c;均由使用者本人负责。 郑重声明&#x…

2019年全国硕士研究生入学统一考试管理类专业学位联考数学试题——纯题目版

2019 年 1 月份管综初数真题 一、问题求解&#xff08;本大题共 5 小题&#xff0c;每小题 3 分&#xff0c;共 45 分&#xff09;下列每题给出 5 个选项中&#xff0c;只有一个是符合要求的&#xff0c;请在答题卡上将所选择的字母涂黑。 1、某车间计划 10 天完成一项任务&a…

网络变压器/网络滤波器 国产化替代一般需要签订哪一些相关文件

Hqst华强盛导读&#xff1a;网络变压器/网络滤波器 国产化替代一般需要签订哪一些相关文件 在国内推广和应用国产替代网络变压器/滤波器时&#xff0c;需要签定一系列的文件&#xff0c;以确保网络变压器/滤波器的质量和安全&#xff0c;同时遵守国家相关的法律法规和政策规定…

JS实现选择图片剪裁及保存

JS实现选择图片剪裁及保存 以下是一个简单的示例代码&#xff0c;实现了显示一个文件上传框和一个canvas元素。用户可以选择一张图片文件后&#xff0c;该图像将显示在canvas中&#xff0c;并且用户可以通过鼠标拖拽来选取需要剪裁的区域。单击“剪裁”按钮&#xff0c;程序会…