protoc初识

protoc初识

参考资料

https://blog.csdn.net/qq_46637011/article/details/135085568

https://blog.csdn.net/qq_39400324/article/details/134172333

一 前期准备

windows查看proto是否安装好及版本号

protoc --version

windows查看路径下文件

dir

想在124.50机器上安装protobuf,执行build.sh脚本的时候报错:

configure.ac:109: error: possibly undefined macro: AC_PROG_LIBTOOL
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.

使用如下安装命令报错

apt-get install libtool
-bash: apt-get: command not found

百度查到这个指令,用于centOS系统

sudo yum install libtool

安装成功

二、实现功能

2.1 124.43实现效果

在124.43上实现了proto的反序列化

但是过程很曲折,甚至反序列化成功的时候我还是懵的,而且感觉其中还是有问题,但是聊胜于无,

root@0002:~/zhuyfTest/protobuf/myFirstTest/bu# ./myFirstTest
10, man, lucy, 32
ʹ▒▒<windows.h>ͷ▒ļ▒▒▒▒▒▒ļ▒
ʹ▒▒<dirent.h>ͷ▒ļ▒▒▒▒▒▒ļ▒
Hello, World!

2.2 解决两个报错

下面描述一下整个过程

首先我在Clion上调试失败了,都找不到远程服务器了。直接本地调试报错

D:\APP\CLion\CLion 2023.2.2\bin\mingw\bin/ld.exe: cannot find -lprotobuf: No such file or directory
D:\APP\CLion\CLion 2023.2.2\bin\mingw\bin/ld.exe: cannot find -lprotoc: No such file or directory
collect2.exe: error: ld returned 1 exit status

我就直接在124.50机器上直接cmake,但是报错

/usr/bin/ld: CMakeFiles/main.cpp.dir/main.cpp.o: in function test()': /data2/myFirstTest/main.cpp:172: undefined reference to google::protobuf::MessageLite::SerializeToString(std::__cxx11::basic_string<char, std::char_traits, std::allocator >*) const’
/usr/bin/ld: /data2/myFirstTest/main.cpp:176: undefined reference to google::protobuf::MessageLite::ParseFromString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: /data2/myFirstTest/main.cpp:175: undefined reference to Person::~Person()’
/usr/bin/ld: /data2/myFirstTest/main.cpp:164: undefined reference to Person::~Person()' /usr/bin/ld: /data2/myFirstTest/main.cpp:175: undefined reference to Person::~Person()’
/usr/bin/ld: /data2/myFirstTest/main.cpp:164: undefined reference to `Person::~Person()’

我已查看protoc --version,查不到版本号,我试着用protobuf的编译脚本编译protobuf,编译好了查看版本号还是没有版本号,还是不行。

#!/bin/bash

set -ex

PREFIX_INC_PATH=$(cd "$(dirname "$0")";pwd)

mv protobuf-21.9 protobuf
chmod -R 777 protobuf
cd protobuf
./autogen.sh
./configure --prefix=$PREFIX_INC_PATH/install --with-pic

make -j 32
make install

export LD_LIBRARY_PATH=${PREFIX_INC_PATH}/install/lib:$LD_LIBRARY_PATH

我就跑到124.43上试试,因为124.43上可以查到protoc版本号

protoc --version
libprotoc 3.21.9

我执行cmake编译,有报错,而且报错也和124.50差不多,找不到定义

undefined reference to google::protobuf::MessageLite::SerializeToString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) const' /usr/local/bin/ld: /root/zhuyfTest/protobuf/myFirstTest/main.cpp:176: undefined reference to google::protobuf::MessageLite::ParseFromString(std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&)’
/usr/local/bin/ld: /root/zhuyfTest/protobuf/myFirstTest/main.cpp:175: undefined reference to Person::~Person()' /usr/local/bin/ld: /root/zhuyfTest/protobuf/myFirstTest/main.cpp:164: undefined reference to Person::~Person()’
/usr/local/bin/ld: /root/zhuyfTest/protobuf/myFirstTest/main.cpp:175: undefined reference to Person::~Person()' /usr/local/bin/ld: /root/zhuyfTest/protobuf/myFirstTest/main.cpp:164: undefined reference to Person::~Person()’

但是编译出可执行文件了,我一执行,成功打印出信息。

现在起码是看到效果了,再继续看看。

目前的代码情况是虽然打印出结果了,但是还是有报错信息,报错信息如下

/usr/local/bin/ld: DWARF error: could not find variable specification at offset 2094
/usr/local/bin/ld: DWARF error: could not find variable specification at offset 20f0
/usr/local/bin/ld: DWARF error: could not find variable specification at offset 2158
/usr/local/bin/ld: DWARF error: could not find variable specification at offset e83f
/usr/local/bin/ld: DWARF error: could not find variable specification at offset e84b
...
...
CMakeFiles/main.cpp.dir/main.cpp.o: in function `test()':
/root/zhuyfTest/protobuf/myFirstTest/main.cpp:172: undefined reference to `google::protobuf::MessageLite::SerializeToString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) const'
/usr/local/bin/ld: /root/zhuyfTest/protobuf/myFirstTest/main.cpp:176: undefined reference to `google::protobuf::MessageLite::ParseFromString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/local/bin/ld: /root/zhuyfTest/protobuf/myFirstTest/main.cpp:175: undefined reference to `Person::~Person()'
/usr/local/bin/ld: /root/zhuyfTest/protobuf/myFirstTest/main.cpp:164: undefined reference to `Person::~Person()'
/usr/local/bin/ld: /root/zhuyfTest/protobuf/myFirstTest/main.cpp:175: undefined reference to `Person::~Person()'

针对第一个问题,/usr/local/bin/ld: DWARF error: could not find variable specification at offset 2094

解决办法是将CMakeList.txt语句

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -D_DEBUG")
//改成
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg -D_DEBUG")

原因不知道,参考:https://blog.csdn.net/chen134225/article/details/126316536

第二个问题的原因是我的CmakeList问题,

有误版CmakeList

cmake_minimum_required(VERSION 3.16.5)
get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId} CXX)

#set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-std=c++11 -pthread")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -D_DEBUG")

if (PLATFORM STREQUAL WINDOWS OR PLATFORM STREQUAL windows)
    SET(PLATFORM windows)
    add_definitions(
            -DWIN32
    )
else ()
    SET(PLATFORM linux)
    add_definitions(
            -Dlinux
    )
endif()

include_directories(../myFirstTest/3rd/protobuf/auto/include)
include_directories(../myFirstTest/3rd/protobuf/src)
include_directories(../myFirstTest/include)

aux_source_directory(../myFirstTest/3rd/protobuf/auto/src protobufSrc)

link_directories(../myFirstTest/3rd/protobuf/lib/linux)

file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
foreach(file ${files})
    get_filename_component(name ${file} NAME)
    add_executable(${name} ${file}
            include/protobufProtocal.h)
endforeach()

add_executable(myFirstTest
        ${protobufSrc}
        main.cpp)

TARGET_LINK_LIBRARIES(myFirstTest protobuf protoc)

成功版本

cmake_minimum_required(VERSION 3.16.5)
get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId} CXX)

#set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-std=c++11 -pthread")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg -D_DEBUG")

if (PLATFORM STREQUAL WINDOWS OR PLATFORM STREQUAL windows)
    SET(PLATFORM windows)
    add_definitions(
            -DWIN32
    )
else ()
    SET(PLATFORM linux)
    add_definitions(
            -Dlinux
    )
endif()

include_directories(../myFirstTest/3rd/protobuf/auto/include)
#include_directories(../myFirstTest/3rd/protobuf/src/google/protobuf)
include_directories(../myFirstTest/3rd/protobuf/src)
include_directories(../myFirstTest/include)

aux_source_directory(../myFirstTest/3rd/protobuf/auto/src protobufSrc)

#link_directories(../myFirstTest/3rd/protobuf/lib/linux)

file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
foreach(file ${files})
    get_filename_component(name ${file} NAME)
    add_executable(${name} ${file})
endforeach()

add_executable(myFirstTest
        ${protobufSrc}
        main.cpp)

TARGET_LINK_LIBRARIES(myFirstTest protobuf protoc)

问题出现在这里

file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
foreach(file ${files})
    get_filename_component(name ${file} NAME)
    add_executable(${name} ${file})
endforeach()

注释掉这些语句,然后重新cmake,再make,就能编译成功了,执行./myFirstTest,执行成功

root@0002:~/zhuyfTest/protobuf/myFirstTest/buildTest# ./myFirstTest
10, man, lucy, 32
Hello, World!

2.4 windows环境Clion远程调试实现效果

以上就是在linux环境下将protobuf序列化和反序列化实现。然后就回到一开始出现的问题,windows环境Clion没有执行成功。

报错

D:\APP\CLion\CLion 2023.2.2\bin\mingw\bin/ld.exe: CMakeFiles/myFirstTest.dir/3rd/protobuf/auto/src/firstVersion.pb.cc.obj: in function Person::Person(Person const&)': D:/AppData/CLion/myFirstTest/3rd/protobuf/auto/src/firstVersion.pb.cc:112: undefined reference to google::protobuf::internal::ArenaStringPtr::Set(std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&, google::protobuf::Arena*)’
D:\APP\CLion\CLion 2023.2.2\bin\mingw\bin/ld.exe: D:/AppData/CLion/myFirstTest/3rd/protobuf/auto/src/firstVersion.pb.cc:120: undefined reference to google::protobuf::internal::ArenaStringPtr::Set(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, google::protobuf::Arena*)' D:\APP\CLion\CLion 2023.2.2\bin\mingw\bin/ld.exe: CMakeFiles/myFirstTest.dir/3rd/protobuf/auto/src/firstVersion.pb.cc.obj: in function Person::Clear()‘:
D:/AppData/CLion/myFirstTest/3rd/protobuf/auto/src/firstVersion.pb.cc:175: undefined reference to google::protobuf::internal::ArenaStringPtr::ClearToEmpty()' D:\APP\CLion\CLion 2023.2.2\bin\mingw\bin/ld.exe: D:/AppData/CLion/myFirstTest/3rd/protobuf/auto/src/firstVersion.pb.cc:176: undefined reference to google::protobuf::internal::ArenaStringPtr::ClearToEmpty()’
D:\APP\CLion\CLion 2023.2.2\bin\mingw\bin/ld.exe: CMakeFiles/myFirstTest.dir/3rd/protobuf/auto/src/firstVersion.pb.cc.obj: in function `Person::_InternalParse(char const*, google::protobuf::internal::ParseContext*)':

这时候如果把下面的语句注释掉,

link_directories(../myFirstTest/3rd/protobuf/lib/linux)

则不出现上述报错,出现下述报错

显示信息

D:\APP\CLion\CLion 2023.2.2\bin\mingw\bin/ld.exe: cannot find -lprotobuf: No such file or directory
D:\APP\CLion\CLion 2023.2.2\bin\mingw\bin/ld.exe: cannot find -lprotoc: No such file or directory

我认为这边是因为linux环境下无法使用.a文件,需要配置lib静态库文件导致的。

然后我又想到再试下远程调试,还是不能远程调试。我把setting里面的Cmake反复切换也是不行,然后突然想到是不是应该把工程中的几个名称如[cmake-build-debug-*]等文件夹删掉?

删除文件夹试了一下,可以远程调试,执行成功,成功打印出反序列化数据。

2.5 windows环境CLion本地实现效果

2.5.1 安装cmake

cmake安装参考教程:https://blog.csdn.net/jlm7689235/article/details/131087421

windows编译protobuf静态库文件参考教程:https://blog.csdn.net/g9208/article/details/102640357

下载cmake:https://cmake.org/download/网址
在这里插入图片描述

windows安装zlib:https://blog.csdn.net/Strive_For_Future/article/details/134080450

2.5.2 cmake编译静态库文件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HCIP【路由过滤、路由引入实验】

目录 实验要求&#xff1a; 实验拓扑图&#xff1a; 实验思路&#xff1a; 实验步骤&#xff1a; 一、配IP地址 二、在相应的设备上配置RIP协议和OSPF协议 三、路由引入 四、路由过滤 五、配置静默接口 实验要求&#xff1a; 1、按照图示配置 IP 地址&#xff0c;R1&a…

Android Glide centerCrop/fitCenter与ImageView的scaleType相互作用,Kotlin

Android Glide centerCrop/fitCenter与ImageView的scaleType相互作用&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width&quo…

Qt绘制边框有阴影兼容性问题

在Qt开发过程中&#xff0c;有时候我们要显示一个有阴影的对话框&#xff0c;这时一般采用自定义实现&#xff0c;然而最近在开发时软件时&#xff0c;Win11上显示正常&#xff0c;Win10或其他Win11电脑显示不正常&#xff0c;存在兼容性问题吗&#xff1f; 下面是具体的源码 …

day_8题解

利用最大公约数求最小公倍数 #include<iostream> using namespace std;int gcd(int a,int b) {return b?gcd(b,a%b):a; }int main() {long long a,b;cin>>a>>b;long long ansgcd(a,b);cout<<(a*b)/ans<<endl;return 0; }排序遍历&#xff0c;记…

不安全软件,2024 年供应商该如何应对漏洞?

关键在于代码 使用专用工具和系统分析产品代码编写的各个阶段。 与安全研究人员合作 理想情况下&#xff0c;每个供应商都应该有自己持续的漏洞赏金计划&#xff0c;以测试基础设施、软件发布流程和最终产品。这将有助于在真正的攻击发生之前发现漏洞&#xff0c;保护客户。…

Mockito

小王学习录 依赖注解MockSpy静态方法单元测试InjectMocks 注解Captor 注解BeforeAll 和 BeforeEach的区别ParameterizedTestValueSourceEnumSourceCsvSourceMethodSource 打桩打桩方式打桩参数匹配方式 依赖 <!-- https://mvnrepository.com/artifact/org.mockito/mockito-i…

Django模型的属性与方法

本节介绍Django模型的属性和方法&#xff0c;以及如何重写之前定义的模型方法等内容。 3.5.1 模型属性 Django模型中最重要的属性就是Manager&#xff0c;它是Django模型和数据库查询操作之间的接口&#xff0c;并且被用作从数据库当中获取实例的途径。如果Django模型中没有…

探索大型语言模型(LLM)在人类性格个性评估(MBTI)中的前景与应用

1.概述 大型语言模型&#xff08;LLM&#xff09;如ChatGPT在各个领域的应用确实越来越广泛&#xff0c;它们利用庞大的数据集进行训练&#xff0c;以模拟人类的语言理解和生成能力。这些模型在提供信息、解答问题、辅助决策等方面表现出了强大的能力&#xff0c;但它们并不具…

微电子领域常见概念(六)化学键合

微电子领域常见概念&#xff08;六&#xff09;化学键合 化学键合是化学中一个非常基础且重要的概念&#xff0c;它描述了原子之间通过电子的相互作用形成的连接。可以进行以下分类&#xff1a; 1. 离子键合&#xff08;Ionic Bonding&#xff09; • 定义&#xff1a;离子键合…

如何查看自己的公网IP?

我们在网络中&#xff0c;每一个设备都被分配了一个唯一的IP地址&#xff0c;用以区分和识别其他设备。公网IP地址是指可被公众访问的IP&#xff0c;是因特网上的全球唯一标识。当我们需要查看自己的公网IP时&#xff0c;可以采取以下几种方式。 使用命令行查看公网IP 在Windo…

书生·浦语大模型实战训练营--第二期第七节--OpenCompass大模型评测实战--homework

一、配置环境 安装下面的顺序以及自己的文件路径配置环境 conda create -n opencompass python3.10 -y 安装下面的包 absl-py accelerate>0.19.0 boto3 cn2an cpm_kernels datasets>2.12.0 einops0.5.0 evaluate>0.3.0 fairscale func_timeout fuzzywuzzy immutab…

Linux 系统IO函数之stat、lstat函数

1、stat函数 要点&#xff1a; int stat(const char *pathname, struct stat *statbuf); 作用&#xff1a;查看文件的信息 man 2 stat/return value1、stat结构体&#xff1a; 2、sturct stat 结构体中 st_mode 的含义&#xff08;文件的类型和存取的权限&#xff09;: st_mo…

zabbix“专家坐诊”第237期问答

问题一 Q&#xff1a;在一台虚拟机安装了mysql数据库服务器上安装了agent&#xff0c;将MySQL by Zabbix agent模板联接上去了&#xff0c;但增加的mysql监控项&#xff0c;全部显示为不支持的&#xff0c;这是什么原因&#xff1f; A&#xff1a;这个是自定义脚本的形式&#…

IBM SPSS Statistics for Mac:强大的数据分析软件

IBM SPSS Statistics for Mac是一款功能强大的数据分析软件&#xff0c;专为Mac用户设计&#xff0c;提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生&#xff0c;都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…

【UI】element-ui的el-dialog的遮罩层在模态框的前面bug

最近在写element ui 的时候使用dialog组件&#xff0c;偶然出现了这种情况 原因&#xff1a; 是因为遮罩层插入进了body标签下&#xff0c;z-index高于当前父元素。 解决&#xff1a;在el-dialog标签里加上:modal-append-to-body"false"就可以了。 饿了么官网文档&a…

熊猫电竞赏金赛系统源码 APP+H5双端源码附搭建教程下载

熊猫电竞赏金系统简介 熊猫电竞赏金电竞系统 赏金赛源码&#xff0c;用户通过平台打比赛&#xff0c;赢了获得奖金奖励&#xff0c; 金币赛、赏金赛、vip赛等种赛事 可开王者荣耀、和平精英比赛 支持1v1、单排、双排组、战队排等多种比赛模式 支持QQ区、微信区 游戏玩的好…

大语言模型(LLM)漏洞爆发,AI模型无一幸免

本文概述了人工智能初创公司Anthropic于2024年04月03日发表的一篇针对人工智能安全的论文&#xff0c;该公司在本论文中宣布的一种新的“越狱”技术&#xff0c;名为Many-shot Jailbreaking&#xff08;多轮越狱&#xff09;。文章详细描述了目前大语言模型&#xff08;LLM&…

iOS 在OC旧项目中使用Swift进行混编

iOS 在OC旧项目中使用Swift进行混编 1、创建桥接文件 ​ 第一次在Swift创建OC文件&#xff0c;或者第一次OC创建Swift时&#xff0c;xcode会提示桥接&#xff0c;Creat Bridging Header即可,这个文件用于Swift调用OC文件&#xff0c;与OC调用Swift无关。 2、在TARGETS中设置D…

深入docker-swarm overlay网络模型

目录 1.简介 2.网络模型 3.docker_gwbridge网络 3.1.docker_gwbridge网关地址 3.2.检查docker_gwbridge网络 3.2.1.查找任务容器eth接口 3.2.2.查找ingress-sbox容器eth接口 4.检查ingress网络 4.1.检查ingress网络 4.2.检查ingress网络的命名空间 4.2.1.查找任务容…

LLM学习之自然语言处理简单叙述

自然语言处理基础 自然语言处理&#xff1a;让计算机读懂人所写好的这些文本&#xff0c;能够像人一样进行交互。 自然语言处理的任务和应用 任务&#xff1a; 词性标注 part of speech tagging 动词&#xff0c;名词&#xff0c;形容词&#xff1f; 命名实体的识别 name…