从零开始:Protobuf C++ 版在Linux环境下的编译与实战应用

protobuf 的交叉编译使用(C++) 为了提高通信效率,可以采用 protobuf 替代 XML 和 Json 数据交互格式,protobuf 相对来说数据量小,在进程间通信或者设备之间通信能够提高通信速率。下面介绍 protobuf 在 ARM 平台上的使用。 阅读详情

1. 为什么我们需要Protobuf?从“语言不通”到“高效沟通”

如果你写过网络程序,或者做过需要保存数据的应用,肯定遇到过数据交换的难题。比如,你用C++写了一个服务端,用Python写了一个客户端,它们之间怎么传数据?最简单的办法可能是用字符串,比如拼成"name:张三,age:25"这种格式。但这种方式太脆弱了,字段一多、结构一变,解析起来就是一场灾难。再高级一点,用JSON或者XML。这俩确实是通用语言,人也能看懂,但问题也来了:体积大、解析慢。在网络传输和存储场景下,每一字节、每一毫秒都很珍贵。

这时候,Protobuf(Protocol Buffers)就该登场了。你可以把它想象成一种为机器设计的、极度高效的“摩斯电码”。它不像JSON那样把字段名"name"、"age"明文打出来,而是用数字编号来代表每个字段。传输和存储时,只传编号和对应的值,数据自然就小了很多。而且它的编码格式是二进制的,计算机解析起来飞快。我最早接触Protobuf是在一个实时对战游戏的后台项目里,当时从JSON切换到Protobuf,网络包大小直接减少了60%以上,服务器CPU压力肉眼可见地降了下来,那种性能提升带来的爽感,至今记忆犹新。

Protobuf的另一个核心优势是“契约先行”。你需要先定义一个.proto文件,在里面像写结构体一样,明确规定好数据的格式(有哪些字段,叫什么名字,是什么类型)。这个.proto文件就是你和所有参与方(不同服务、不同语言)签的一份“数据合同”。之后,无论你用C++、Go、Java还是Python,都可以用Protobuf提供的编译器,把这份合同翻译成你自己语言的代码。这样一来,大家读写数据都遵循同一套规则,彻底杜绝了“鸡同鸭讲”的问题。这种强制的、清晰的接口定义,对于团队协作和长期维护来说,价值巨大。

2. 手把手准备:Linux下的编译环境搭建

万事开头难,但把环境准备好,后面就一马平川了。我强烈建议你在自己的Linux虚拟机或者云服务器上跟着操作一遍,光看是记不住的。咱们的目标是把Protobuf的C++版本从源代码编译成我们自己的工具和库。

2.1 安装必需的“建筑材料”

编译软件就像盖房子,需要先把各种工具和材料备齐。在Ubuntu或者Debian这类系统上,打开你的终端,输入下面这条命令,把编译需要的工具链和库都装好:

sudo apt-get update
sudo apt-get install autoconf automake libtool curl make g++ unzip -y

我来简单说说这几个工具是干嘛的:

  • autoconf, automake, libtool:这“三剑客”是GNU家族里用来生成跨平台编译脚本(configure)的老将。很多开源软件都用它们来适应不同的Unix-like系统。
  • curl:用来从网络下载文件,我们可能会用到它来抓取源码包。
  • make, g++:这是核心的编译工具。make负责指挥整个构建流程,g++就是C++编译器本人。
  • unzip:解压工具,以防源码包是zip格式。

运行命令后,静静等待安装完成。如果系统提示你确认,输入y回车就行。这一步通常很顺利,如果遇到网络问题,可以换个软件源试试。

2.2 获取Protobuf的“源代码图纸”

有两种主流方式可以拿到Protobuf的源代码。第一种是下载官方打包好的稳定版压缩包,这种方式最直接,适合新手和追求稳定的生产环境。我们以protobuf-cpp-3.9.1.tar.gz这个版本为例(虽然现在有更新的21.x、22.x版本,但3.9.1版本非常经典稳定,很多老项目还在用,学习原理完全足够)。

你可以用浏览器访问Protobuf在GitHub的发布页面,找到对应版本下载。也可以在终端里直接用wget命令下载:

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.9.1/protobuf-cpp-3.9.1.tar.gz

下载完成后,用tar命令解压这个“压缩包”:

tar -xzvf protobuf-cpp-3.9.1.tar.gz

解压后会得到一个protobuf-3.9.1的目录,这就是我们的源代码目录。

第二种方式是通过git克隆整个仓库。这种方式能拿到最新的代码(包括可能还没发版的特性),适合想尝鲜或为社区做贡献的开发者。命令如下:

git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive

注意,克隆仓库后,一定要执行git submodule update --init --recursive这条命令。因为Protobuf项目引用了一些子模块(比如测试用的gtest),这条命令就是把这些子模块的代码也拉取下来,否则后续编译测试时会出错。这是我曾经踩过的一个坑,编译一切顺利,但make check时死活过不去,排查了半天才发现是子模块没初始化。

3. 编译三部曲:配置、构建与安装

源码到手,工具就位,接下来就是施展“魔法”,把源代码变成可执行文件和库了。这个过程是标准的GNU软件安装流程,理解后对安装其他开源软件也大有裨益。

3.1 配置(Configure):告诉系统你的“建房蓝图”

首先,进入我们解压后的源代码目录:

cd protobuf-3.9.1

接下来运行一个非常重要的脚本:./configure。这个脚本会检查你的系统环境,比如编译器在哪儿、依赖库齐不齐,然后根据检查结果生成一个量身定制的Makefile文件。Makefile可以理解为一份详细的“施工图纸”,后面make命令就靠它来指挥编译。

我们可以通过一个参数来指定Protobuf的安装位置,我习惯把它安装到/usr/local/protobuf目录下。/usr/local是系统级软件安装的常用位置,独立于此,便于管理。

./configure --prefix=/usr/local/protobuf

运行这个命令后,终端会刷出一大堆检查信息。你只要关注最后几行,如果没有出现明显的error,一般就说明配置成功了。如果遇到报错,最常见的原因是前面“安装依赖”那一步有遗漏,根据错误提示安装对应的开发包即可(通常名字里会带-dev,比如libssl-dev)。

3.2 编译与测试(Make & Check):开始“施工”并“验收”

配置成功,生成了Makefile,现在可以开始编译了。输入一个简单的命令:

make

这个阶段会比较耗时,具体时间取决于你的电脑CPU性能。你会看到屏幕上不断滚动编译信息,各种.cc文件被编译成.o目标文件,最后链接成库和可执行文件。这是整个过程中最“吃资源”的一步,耐心等待它完成。

编译完成后,强烈建议运行测试套件,这是验证我们编译产物是否健康的关键一步:

make check

测试过程会运行大量的单元测试和集成测试。如果所有测试都通过,你会看到类似PASS: ...的总结信息,最后提示All tests passed。这就像房子盖好后进行的质量验收,确保每一块“砖瓦”都结实可靠。我第一次编译时跳过了测试,结果后来在链接自己项目的时候遇到了奇怪的符号错误,回头重跑测试才发现是编译环境不纯导致某个库没编好。所以,这个时间值得花。

3.3 安装(Install):将成果“搬入新家”

测试通过,万事大吉。现在可以把编译好的文件安装到我们之前指定的/usr/local/protobuf目录了:

sudo make install

这里需要sudo权限,因为要向系统级的/usr/local目录写入文件。这条命令会把可执行文件protoc(Protobuf编译器)复制到/usr/local/protobuf/bin,把头文件(.h)复制到/usr/local/protobuf/include,把库文件(.so或.a)复制到/usr/local/protobuf/lib。

安装完成后,你可以立刻尝试一下最重要的工具——编译器protoc:

/usr/local/protobuf/bin/protoc --version

如果输出类似libprotoc 3.9.1的版本信息,恭喜你,核心工具安装成功了!

4. 让系统找到它:配置环境变量

安装好了,但如果你直接在终端里输入protoc,系统大概率会告诉你“命令未找到”。这是因为系统只在固定的几个路径(比如/usr/bin)里寻找命令,而我们安装的protoc在/usr/local/protobuf/bin里。我们需要通过设置环境变量,把这个新路径告诉系统。

4.1 永久生效的配置方法

为了让每次打开终端都能使用protoc,并且让编译器能找到Protobuf的库,我们需要修改shell的配置文件。对于所有用户生效的配置文件是/etc/profile(对于当前用户,也可以是~/.bashrc或~/.zshrc)。

使用vim或你喜欢的文本编辑器(如nano)打开它:

sudo vim /etc/profile

在文件的末尾,添加以下几行:

# Protobuf Environment Settings
export PATH=$PATH:/usr/local/protobuf/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/protobuf/lib/pkgconfig

我来解释一下这三个变量:

  • PATH:系统查找可执行文件的路径列表。我们把protoc所在的bin目录加进去,以后在任意位置都能直接敲protoc命令了。
  • LD_LIBRARY_PATH:系统在运行时查找动态链接库(.so文件)的路径。把我们安装的库目录加进去,运行依赖Protobuf库的程序时,系统才能找到正确的库文件。这是解决运行时cannot open shared object file错误的关键。
  • PKG_CONFIG_PATH:pkg-config工具用来查找库的编译和链接参数的路径。这对于后续用g++编译你自己的C++项目时,能方便地获取到-I和-l参数。

保存文件并退出编辑器。然后,让这个配置文件立即生效:

source /etc/profile

现在,你再试试:

protoc --version

应该能直接看到版本号了,而不需要输入完整路径。这一步配置非常重要,我见过不少新手编译安装很顺利,但到了自己写程序链接时就各种报错,八成是环境变量没设对。

5. 实战演练:定义你的第一个数据协议并读写

理论说了这么多,不动手永远学不会。让我们来玩一个具体的例子:定义一个“用户信息”的数据结构,并用C++程序把它写到一个文件里,再读出来。

5.1 编写.proto文件——定义“数据合同”

首先,创建一个工作目录,比如protobuf_demo,然后在这个目录里创建我们的合同文件user.proto:

// user.proto
// 指定使用proto3的语法,这是目前主流的版本
syntax = "proto3";

// package相当于命名空间,用于防止消息类型名冲突
package tutorial;

// 定义一个“用户”消息类型
message User {
  // 字段格式:规则 类型 字段名 = 唯一的数字标签;
  string name = 1;       // 用户名,标签为1
  int32 id = 2;          // 用户ID,标签为2
  string email = 3;      // 邮箱,标签为3

  // 枚举类型:定义用户状态
  enum UserStatus {
    OFFLINE = 0; // 枚举值必须从0开始
    ONLINE = 1;
    BUSY = 2;
  }
  UserStatus status = 4; // 使用枚举

  // 重复字段(相当于列表或数组)
  repeated string phone_numbers = 5;
}

这个文件定义了一个User类型,里面有字符串、整数、枚举和字符串列表。每个字段后面的=1、=2是字段标签,这是Protobuf编码的核心。它一旦定义,就尽量不要修改,因为它是字段在二进制流中的唯一标识。

5.2 使用protoc生成C++代码

合同写好了,现在用protoc这个“翻译官”,把它翻译成C++能直接用的类。在工作目录下执行:

protoc --cpp_out=. user.proto
  • --cpp_out=.:告诉protoc生成C++代码,并输出到当前目录(.)。
  • user.proto:是我们的输入文件。

执行成功后,你会看到当前目录下生成了两个文件:user.pb.h和user.pb.cc。这两个文件包含了根据user.proto定义自动生成的C++类,类名就是tutorial::User。这个类提供了完整的接口,让你可以像操作普通C++对象一样,设置字段、读取字段,并且自带序列化和反序列化的方法。千万不要手动修改这两个生成的文件,因为只要.proto文件一变,它们就会被重新生成覆盖。

5.3 编写C++程序:写入与读取

接下来,我们写两个小程序:一个负责创建一个User对象并序列化到文件(writer.cc),另一个负责从文件读回来并打印内容(reader.cc)。

writer.cc - 数据写入程序

// writer.cc
#include <iostream>
#include <fstream>
#include "user.pb.h"

int main() {
    // 1. 创建一个User对象
    tutorial::User user;
    user.set_name("张三");
    user.set_id(2024001);
    user.set_email("zhangsan@example.com");
    user.set_status(tutorial::User::ONLINE); // 设置枚举值
    // 添加重复字段(电话号码)
    user.add_phone_numbers("13800138000");
    user.add_phone_numbers("010-88886666");

    // 2. 将对象序列化成二进制字符串
    std::string serialized_data;
    if (!user.SerializeToString(&serialized_data)) {
        std::cerr << "Failed to serialize user data." << std::endl;
        return -1;
    }

    // 3. 将二进制字符串写入文件
    std::ofstream ofs("user_data.bin", std::ios::binary);
    if (!ofs.write(serialized_data.c_str(), serialized_data.size())) {
        std::cerr << "Failed to write to file." << std::endl;
        return -1;
    }
    ofs.close();

    std::cout << "User data has been written to 'user_data.bin'." << std::endl;
    std::cout << "Original size: " << user.ByteSizeLong() << " bytes." << std::endl;

    return 0;
}

reader.cc - 数据读取程序

// reader.cc
#include <iostream>
#include <fstream>
#include "user.pb.h"

int main() {
    // 1. 从文件读取二进制数据
    std::ifstream ifs("user_data.bin", std::ios::binary);
    if (!ifs) {
        std::cerr << "Failed to open file." << std::endl;
        return -1;
    }
    // 获取文件大小
    ifs.seekg(0, std::ios::end);
    int file_size = ifs.tellg();
    ifs.seekg(0, std::ios::beg);

    char* buffer = new char[file_size];
    ifs.read(buffer, file_size);
    ifs.close();

    std::string serialized_data(buffer, file_size);
    delete[] buffer;

    // 2. 反序列化二进制数据到User对象
    tutorial::User user;
    if (!user.ParseFromString(serialized_data)) {
        std::cerr << "Failed to parse user data." << std::endl;
        return -1;
    }

    // 3. 打印对象内容
    std::cout << "=== Parsed User Info ===" << std::endl;
    std::cout << "Name: " << user.name() << std::endl;
    std::cout << "ID: " << user.id() << std::endl;
    std::cout << "Email: " << user.email() << std::endl;
    std::cout << "Status: " << user.status() << std::endl; // 输出枚举对应的整数值
    std::cout << "Phone Numbers: ";
    for (int i = 0; i < user.phone_numbers_size(); ++i) {
        std::cout << user.phone_numbers(i) << " ";
    }
    std::cout << std::endl;

    return 0;
}

5.4 编译并运行你的程序

最后一步,把我们的程序和Protobuf库链接起来。在终端里执行编译命令:

# 编译写入程序
g++ -std=c++11 writer.cc user.pb.cc -o writer -lprotobuf -pthread
# 编译读取程序
g++ -std=c++11 reader.cc user.pb.cc -o reader -lprotobuf -pthread

这里有几个关键点:

  • -std=c++11:指定使用C++11标准,Protobuf生成的代码需要这个或更高标准。
  • writer.cc user.pb.cc:将我们写的源码和protoc生成的源码一起编译。
  • -lprotobuf:链接Protobuf的动态库。这就是为什么之前要设置LD_LIBRARY_PATH,否则链接器会找不到这个库。
  • -pthread:因为Protobuf库内部可能使用了线程,所以需要链接线程库。

编译成功后,你会得到writer和reader两个可执行文件。先运行写入程序:

./writer

你会看到它生成了一个user_data.bin文件,并打印出数据大小。用ls -lh看看,这个文件通常只有几十到几百字节,非常紧凑。然后运行读取程序:

./reader

如果一切正常,reader会完美地还原出之前写入的所有用户信息。这个过程就是Protobuf工作的核心:通过预先定义好的.proto契约,实现高效、准确的数据序列化与反序列化。你可以尝试修改writer.cc里的数据,或者给.proto文件增加新的字段(注意给新字段新的标签号),重新生成.pb文件并编译,体验一下协议扩展的流程。在实际项目中,正是这种清晰、可扩展的协议定义,让多服务、多语言团队之间的数据交互变得可靠而高效。

从零开始:Protobuf C++ 版在Linux下的编译安装与实战入门 本文详细介绍了在Linux环境下从零开始编译安装Protobuf C++版的完整流程,包括环境准备、源码获取、编译安装、环境变量配置以及实战演练。通过具体的代码示例和常见问题解决方案,帮助开发者快速掌握Protobuf的高效数据序列化技术,适用于分布式系统开发等场景。 阅读详情

相关推荐

Linux下从源码编译安装Protobuf C++库的完整实践指南

Protocol Buffers(Protobuf)是一种高效、跨语言、平台无关的序列化协议,广泛应用于网络通信、数据存储和微服务架构。其核心原理是通过预定义的.proto文件描述数据结构,并生成目标语言代码,实现结构化数据的二进制序列化与反序列化,相比XML和JSON具有更小的体积和更快的解析速度。在C++开发中,手动编译安装Protobuf能实现对特定版本、编译选项和部署环境的精细控制,尤其适用于需要定制化编译、深入调试或确保生产环境依赖一致性的场景。本文以Ubuntu 22.04为例,详细演示了从源码

weixin_29190651的博客 265

Hello! protobuf——编译与安装(c++版)

Protocol Buffers是Google开发的一种平台无关,语言无关,可扩展的的序列化结构数据格式,类似与XML,但是比XML更小,更快,更简单。你只需要按照规则定义你需要的数据结构,然后通过专门的源代码生成工具就可以生成各种语言所需要的数据类文件。非常好用~ ...

wzw1609119742的博客 1万+

C++ gRPC环境部署:四层构建链路与ABI兼容性实战指南

gRPC 是一种基于 Protocol Buffer 的高性能 RPC 框架,其 C++ 实现依赖严格的协议定义、代码生成、运行时库和构建系统四层协同。核心原理在于跨组件的 ABI 兼容性保障——protoc 编译器与 grpc_cpp_plugin 必须同版本,头文件声明需与 libgrpc++.so 导出符号精确匹配,CMake 链接顺序影响符号解析,而 C++ 标准库绑定(如 /MD vs /MT)决定运行时稳定性。该技术价值在于支撑高频交易、自动驾驶、大模型推理等对延迟与可靠性敏感的工业级通信场景。

weixin_34401479的博客 426

如何编译安装 protocolBuffer(for C++)

一、简述今天这一篇文章讲一讲 protocolBuffer 的编译安装步骤。首先了解一下什么是protocolBuffer。(以下摘自百度百科),如果还不不明白,go on 百度一下。 protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相

游学四方的博客 2091

ProtoBuf - 从零到一:Windows/Linux双平台环境搭建全攻略

本文提供了一份详尽的ProtoBuf在Windows和Linux双平台下的环境搭建全攻略。针对C++开发者,详细讲解了从源码编译、环境配置到项目集成的完整流程,重点解决了Windows下Visual Studio的DLL链接问题以及Linux下内存不足导致make check失败的常见难题,并附有实战项目示例,帮助开发者快速构建稳定可用的ProtoBuf开发环境。

weixin_28829629的博客 206

protobuf编译好的文件

编译好直接可以使用的protobuf文件。运行bat文件,即可直接生成对应.proto的头文件和源文件

protobuf编译、安装和简单使用C++(Windows+VS平台)

protobuf编译、安装和简单使用C++(Windows+VS平台) 修改于2020-03-23 10:59:49阅读 2.3K0 windows下安装Protobuf 首先需要下载源代码 下载如下cpp版本 解压后得到一个目录,等下CMake会用到 如果你电脑没有CMake,需要去官网下载 双击打开下载解压后的CMake目录/bin/cmake-gui.exe 现在,选择刚才解压的目录,和构建输出目录 然后选择Configure 选择你的VS版本,然后finish即可 点击Generate,成功后,进入

dhl11的博客 2326

MySQL 分库分表及其平滑扩容方案

MyCAT不仅仅可以用作读写分离,以及分表分库、容灾管理,而且可以用于多租户应用开发、云平台基础设施,让你的架构具备很强的适应性和灵活性。分表对于一张多行(记录)多列(字段)的二维数据表,又分两种情形(1)垂直分表竖向切分,不同分表存储不同的字段,可以把不常用或者大容量、或者不同业务的字段拆分出去;扩容前每个节点的数据,有一半要迁移至一个新增节点中,对应关系比较简单。此时,四个节点的数据都已完整,只是有冗余(多存了和自己配对的节点的那部分数据),择机清除即可(过后随时进行,不影响业务)。...

m0_71777195的博客 1929

c++ protobuf 编译、使用

安装cmake 环境变量添加 Path=cmake bin文件夹目录 下载解压 protobuf 编译protobuf 这里以编译32位的debug版本为例,如果是release版本,可以将各条命令中的debug路径修改为release路径,最关键的一点是将第5条命令中的 “-DCMAKE_BUILD_TYPE=Debug” 修改为 “-DCMAKE_BUILD_TYPE=Release...

u013659062的博客 2037

Truncated SVD for faster dection

Truncated SVD方法最先被提出在《Fast R-CNN》论文中,用于降低全连接层的运算量,提升模型的速度。在卷积神经网络的分类任务中,FC层的运算速度远远大于CONV层,而在Fast R-CNN的目标检测任务中,大多数的运算时间发生在FC 的运算中,是因为针对每张输入图片,只进行一次卷积操作,而要对生成的Region Proposal,大致两千个,进行全连接操作进行分类与Bounding...

weixin_35747666的博客 1535

嵌入式常用通信协议 #概述

嵌入式通信协议

AFK3060的博客 2116

从零开始学习Protobuf(C++实战版)

摘要:本文介绍了Google Protocol Buffers(Protobuf)在C++开发中的应用,重点讲解了其安装配置、基础语法和实际应用。主要内容包括:Protobuf与JSON/XML的对比优势,Windows/Linux环境下的安装步骤,通过联系人示例演示.proto文件定义、编译生成C++代码以及序列化/反序列化过程。文章还详细解析了Proto3语法规则,包括字段类型、嵌套消息和枚举定义,最后通过通讯录实战项目展示了Protobuf在实际开发中的完整应用流程。

zoelinkailuo的博客 1214

【Linux】Petalinux使用QSPI FLASH引导启动

1. 预分配Flash空间使用Flash引导Petalinux做的系统,也有进阶的做法。部分图片和经验来源于网络,若有侵权麻烦联系我删除,主要是做笔记的时候忘记写来源了,做完笔记很久才写博客。1. 预分配Flash空间根据生成的bit文件大小估算BOOT.BIN文件的大小,为Flash大概分配四个分区:boot、bootenv、kernel、bootscr,分别存放BOOT.BIN文件、u-boot的环境变量、内核文件(image.ub/zImage/uImage等)、启动脚本boot.scr。

Tesseract_9527的博客 3375

Linux环境下Protobuf完整安装和使用教程

Linux环境下Protobuf完整安装和使用教程目标下载和安装环境配置一个例子1、报文定义2、报文生成3、使用报文4、编译程序5、常见问题: 目标 本文将教会一个完全的新手如何搭建自己的protobuf Linux环境,并配置好编程环境,并使用一个例子帮助你学会使用protobuf. 下载和安装 1、下载protobuf安装包 $ git clone https://github.com/protocolbuffers/protobuf.git 2、安装依赖库 $ cd protobuf/ $ ./au

WangIcter的专栏 2万+

故障排查:OpenClaw 更新后 feishu 插件路径失效的解决方法

OpenClaw 更新后 feishu 插件路径失效的解决方法发现问题→ Gateway 启动失败,报插件路径错误定位原因→ OpenClaw 目录结构变化,→解决问题→ 更新为正确的路径验证修复→ 使用确认一切正常。

刘一说的IT专栏 1304

微信小程序数据采集实战:抓包+接口分析+动态数据全流程

微信小程序爬虫虽然比普通网页爬虫复杂,但只要掌握了正确的方法,其实并没有想象中那么难。核心思路就是:先绕过证书校验抓包,然后反编译小程序找到加密逻辑,最后用Python模拟相同的加密和解密过程。需要特别提醒的是,本文仅供技术研究使用。请遵守《网络安全法》和相关法律法规,不要爬取他人的敏感数据,不要将爬虫技术用于非法用途。尊重他人的知识产权和数据安全,才能让技术发挥真正的价值。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1092

从零开始编译ds3os:Windows和Linux平台构建完整教程

你是否厌倦了《黑暗之魂3》官方服务器的各种限制?想要创建一个私有的、无作弊的联机环境?ds3os开源服务器项目正是你的理想选择!本文将为你提供完整的ds3os编译指南,帮助你在Windows和Linux平台上轻松构建自己的《黑暗之魂3》私服服务器。 ds3os是一个开源的《黑暗之魂3》服务器实现,允许玩家创建私有服务器进行联机游戏,完全绕过官方服务器的限制。通过本教程,你将学会如何从源代码编译d

gitblog_00740的博客 739

Microsoft Dynamics 365软件二次开发:Dynamics365部署与版本控制策略

在Microsoft Dynamics 365中,自定义实体允许开发者扩展系统以满足特定业务需求。自定义实体可以包含字段、选项集、关系和其他属性,与标准实体类似,但完全由用户定义。1. 登录到Dynamics 365环境。2. 转到“解决方案”区域,选择“自定义”。3. 在“自定义”菜单中,选择“实体”。4. 点击“新建”,输入实体名称,例如“客户反馈”。5. 添加字段,如“反馈类型”、“反馈日期”、“描述”等。6. 设置主键和唯一标识符。7. 定义关系,如与“客户”实体的关联。

kkchenjj的博客 2208

Windows 10下C++ gRPC开发环境手动编译与配置实战指南

远程过程调用(RPC)是分布式系统和微服务架构中实现跨进程、跨网络通信的核心技术。其基本原理是允许程序调用另一地址空间(通常是远程服务器)上的函数或方法,而无需显式编码远程交互的细节。gRPC作为Google开源的高性能、跨语言RPC框架,基于HTTP/2协议和Protocol Buffers序列化协议,提供了强类型服务定义、双向流、认证等高级特性,技术价值在于显著提升了服务间通信的效率和可维护性。在云原生、大数据处理等应用场景中,gRPC已成为服务网格和组件通信的事实标准。对于在Windows平台进行C+

weixin_33778544的博客 745

基于STM32L4XX、HAL库的IP101GRI以太网收发器(PHY)驱动程序设计

define IP101GRI_PHY_ADDRESS 0x01 // 根据硬件设计设置PHY地址。#define IP101GRI_PHYSTS 0x10 // PHY状态寄存器。#define IP101GRI_PHYINIR 0x12 // PHY中断寄存器。#define IP101GRI_PHYCR 0x14 // PHY控制寄存器。#define IP101GRI_PHYID2 0x03 // PHY标识符2。

zhusl6688的博客 721

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Protobuf 3.1.0安装与C++使用指南

详细介绍Protobuf 3.1.0版本的源码编译安装步骤,包括环境变量配置、.proto文件定义、C++代码生成与编译方法,并通过读写示例演示序列化与反序列化过程,适合初学者快速上手。

weixin_34618526的博客 1066

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【ProtoBuf】从零开始:使用 protoc 工具生成 C++ 头文件与源文件

本文详细介绍了如何使用protoc工具从.proto文件生成C++头文件(.h)和源文件(.cc)。内容涵盖protoc编译器的安装(支持Linux、macOS、Windows系统)、.proto文件的编写规范,以及生成代码在C++项目中的集成与使用。通过实战示例,帮助开发者掌握ProtoBuf这一高效数据序列化工具的核心工作流程,提升网络通信和数据存储场景下的开发效率。

k0l1m2n3o的博客 533

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

移动应用协议逆向实战:绕过SSL Pinning与Protobuf解析

在移动应用安全与数据分析领域,网络通信协议解析是理解应用数据流转逻辑的核心技术。其基本原理在于对客户端与服务器间传输的加密数据进行捕获、解密与结构化还原。这项技术的核心价值在于为自动化测试、风控策略研究、竞品分析与数据聚合服务提供底层数据支持,尤其在当前主流应用广泛采用Protobuf序列化与强化SSL机制的背景下更显重要。典型的应用场景包括安全研究、数据合规分析及第三方服务开发。本文聚焦于通过动态Hook技术绕过SSL Pinning防护,并利用运行时信息逆向技术解析Protobuf协议,完整还原从加密流

weixin_33881140的博客 393

从零开始在Linux编译VLC-Android开源项目

本文以我作为菜鸟的角度来介绍从零开始,到编译出VLC类库和APK的整个过程,所以也会比较啰嗦。

Kw学编程 1万+
上一篇: ThinkPad E40双系统实战:从Windows7到Ubuntu的无缝切换
下一篇: Apifox后置脚本实战:解码并渲染响应中的Base64图片数据
python9snake
博客等级 码龄1天 0粉丝 1724原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值