linux C++ Protobuf 编译安装和初步使用

一、编译安装

1. 下载 protobuf 源代码: 前往 protobuf GitHub 仓库 或 protobuf Releases 下载最新的源代码压缩包。

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.19.2/protobuf-all-3.19.2.tar.gz

2. 解压源代码:

tar -xzvf protobuf-all-3.19.2.tar.gz

3. 进入 protobuf 目录:

cd protobuf-3.19.2

4. 配置和编译:

./configure
make

如果系统没有安装 autoconf 和 automake,需要先安装它们。

5. 安装 protobuf:

make install

6. 更新动态链接库缓存:

ldconfig

7. 验证安装:

运行以下命令验证 protobuf 是否成功安装:

protoc --version

二、使用

步骤 1: 定义 protobuf 消息

新建名为 message.proto 的 protobuf 文件:

protoCopy code
syntax = "proto3";

message Student {
    int32 id = 1;
    string name = 2;
    string email = 3;
}

步骤 2: 生成 C++ 代码

使用 protoc 工具生成 C++ 代码:

protoc message.proto --cpp_out=./

这将生成 message.pb.h 和 message.pb.cc 文件,其中包含了 protobuf 消息的 C++ 定义和实现。

步骤 3: 编写服务器和客户端代码

服务器端 (server.cpp)
#include <iostream>
#include <string>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include "message.pb.h"

#define PORT 8080

int main() {
    // 创建 socket
    int serverSocket = socket(AF_INET, SOCK_STREAM, 0);

    // 绑定 socket
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(PORT);
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));

    // 监听
    listen(serverSocket, 5);
    std::cout << "Server listening on port " << PORT << std::endl;

    // 接受连接
    int clientSocket = accept(serverSocket, nullptr, nullptr);
    std::cout << "Client connected" << std::endl;

    // 接收消息
    Student receivedStudent;
    char buffer[1024];
    recv(clientSocket, buffer, sizeof(buffer), 0);
    receivedStudent.ParseFromArray(buffer, sizeof(buffer));

    // 打印接收到的消息
    std::cout << "Received Student ID: " << receivedStudent.id() << std::endl;
    std::cout << "Received Student Name: " << receivedStudent.name() << std::endl;
    std::cout << "Received Student Email: " << receivedStudent.email() << std::endl;

    // 关闭连接
    close(clientSocket);
    close(serverSocket);

    return 0;
}
客户端 (client.cpp)
#include <iostream>
#include <string>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include "message.pb.h"

#define PORT 8080

int main() {
    // 创建 socket
    int clientSocket = socket(AF_INET, SOCK_STREAM, 0);

    // 连接到服务器
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(PORT);
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
    std::cout << "Connected to server" << std::endl;

    // 创建 Student 消息
    Student student;
    student.set_id(123);
    student.set_name("John Doe");
    student.set_email("john.doe@example.com");

    // 发送消息
    char buffer[1024];
    student.SerializeToArray(buffer, sizeof(buffer));
    send(clientSocket, buffer, sizeof(buffer), 0);
    std::cout << "Student message sent" << std::endl;

    // 关闭连接
    close(clientSocket);

    return 0;
}

步骤 4: 编译和运行

编译服务器和客户端代码:

g++ server.cpp message.pb.cc -o server -lprotobuf
g++ client.cpp message.pb.cc -o client -lprotobuf

运行服务器和客户端:

./server

运行时报错:
[root@d0a10381127c protobuf-test]# ./server ./server: error while loading shared libraries: libprotobuf.so.30: cannot open shared object file: No such file or directory
全局搜索缺少的库,发现在下面的路径里 find / -name libprotobuf.so.30
/home/protobuf-3.19.2/src/.libs/libprotobuf.so.30
/usr/local/lib/libprotobuf.so.30
临时解决:ldconfig /usr/local/lib
永久解决:更改 vi /etc/ld.so.conf 添加上/usr/local/lib 即可。
在这里插入图片描述
在另一个终端窗口中运行:

./client
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值