[{"data":1,"prerenderedAt":64},["ShallowReactive",2],{"article-112":3},{"code":4,"msg":5,"data":6,"count":14},200,"查询成功",{"id":7,"title":8,"keywords":9,"description":10,"category_id":11,"content":12,"body_html":13,"thumb_up":14,"clicks":15,"sort":14,"remark":13,"status":11,"is_open":11,"is_deleted":14,"is_top":11,"is_recommend":11,"create_time":16,"update_time":16,"image_id":17,"url":13,"member_id":14,"cate_name":18,"prev":19,"next":22,"tags":25,"words":35,"read_time":36,"comments":14,"cover":37,"relevant":38},112,"Ubuntu 24.04 安装 Protocol Buffers 3.13 之前版本的完整指南","Ubuntu,Protocol Buffers","在使用 Protocol Buffers 处理二进制数据时，许多开发者遇到了一个重要问题：**Protocol Buffers 3.13 及以后的版本不会将二进制数据准确转换为十六进制字符串**。这导致在处理包含二进制字段的 protobuf 消息时出现兼容性问题。为了解决这个问题，需要在系统上安装 Protocol Buffers 3.13 之前的版本。",1,"## 问题背景\n\n在使用 Protocol Buffers 处理二进制数据时，许多开发者遇到了一个重要问题：**Protocol Buffers 3.13 及以后的版本不会将二进制数据准确转换为十六进制字符串**。这导致在处理包含二进制字段的 protobuf 消息时出现兼容性问题。为了解决这个问题，需要在系统上安装 Protocol Buffers 3.13 之前的版本。\n\n本文将详细介绍在 Ubuntu 24.04 系统上安装旧版本 Protocol Buffers 的多种方法，帮助开发者根据自身需求选择最适合的方案。\n\n## 安装方法详解\n\n### 方法一：使用预编译的二进制文件（推荐）\n\n这是最可靠的安装方法，可以避免复杂的依赖问题，特别适合 Ubuntu 24.04 系统。\n\n#### 安装 protoc 3.12.4（3.13 之前的最后一个稳定版本）\n\n```bash\n# 安装必要依赖\nsudo apt update\nsudo apt install -y wget unzip\n\n# 下载 protoc 3.12.4 版本\nwget https:\u002F\u002Fgithub.com\u002Fprotocolbuffers\u002Fprotobuf\u002Freleases\u002Fdownload\u002Fv3.12.4\u002Fprotoc-3.12.4-linux-x86_64.zip\n\n# 创建安装目录\nsudo mkdir -p \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.12.4\n\n# 解压到安装目录\nsudo unzip protoc-3.12.4-linux-x86_64.zip -d \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.12.4\n\n# 创建符号链接，便于版本管理和使用\nsudo ln -sf \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.12.4\u002Fbin\u002Fprotoc \u002Fusr\u002Flocal\u002Fbin\u002Fprotoc\n\n# 设置包含文件路径\nsudo cp -r \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.12.4\u002Finclude\u002F* \u002Fusr\u002Flocal\u002Finclude\u002F\n\n# 验证安装是否成功\nprotoc --version\n# 预期输出: libprotoc 3.12.4\n\n# 清理临时文件\nrm protoc-3.12.4-linux-x86_64.zip\n```\n\n#### 安装其他 3.13 之前的版本\n\n如需安装其他特定的旧版本，可以使用类似的方法：\n\n```bash\n# 安装 protoc 3.11.4\nwget https:\u002F\u002Fgithub.com\u002Fprotocolbuffers\u002Fprotobuf\u002Freleases\u002Fdownload\u002Fv3.11.4\u002Fprotoc-3.11.4-linux-x86_64.zip\nsudo mkdir -p \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.11.4\nsudo unzip protoc-3.11.4-linux-x86_64.zip -d \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.11.4\nsudo ln -sf \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.11.4\u002Fbin\u002Fprotoc \u002Fusr\u002Flocal\u002Fbin\u002Fprotoc\n\n# 安装 protoc 3.10.1\nwget https:\u002F\u002Fgithub.com\u002Fprotocolbuffers\u002Fprotobuf\u002Freleases\u002Fdownload\u002Fv3.10.1\u002Fprotoc-3.10.1-linux-x86_64.zip\nsudo mkdir -p \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.10.1\nsudo unzip protoc-3.10.1-linux-x86_64.zip -d \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.10.1\nsudo ln -sf \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.10.1\u002Fbin\u002Fprotoc \u002Fusr\u002Flocal\u002Fbin\u002Fprotoc\n\n# 安装 protoc 3.9.2\nwget https:\u002F\u002Fgithub.com\u002Fprotocolbuffers\u002Fprotobuf\u002Freleases\u002Fdownload\u002Fv3.9.2\u002Fprotoc-3.9.2-linux-x86_64.zip\nsudo mkdir -p \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.9.2\nsudo unzip protoc-3.9.2-linux-x86_64.zip -d \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.9.2\nsudo ln -sf \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.9.2\u002Fbin\u002Fprotoc \u002Fusr\u002Flocal\u002Fbin\u002Fprotoc\n```\n\n### 方法二：从源码编译安装\n\n当预编译版本与系统存在兼容性问题时，可以选择从源码编译安装。\n\n#### 编译安装 protoc 3.12.4\n\n```bash\n# 安装编译依赖\nsudo apt update\nsudo apt install -y autoconf automake libtool curl make g++ unzip\n\n# 下载源码\nwget https:\u002F\u002Fgithub.com\u002Fprotocolbuffers\u002Fprotobuf\u002Freleases\u002Fdownload\u002Fv3.12.4\u002Fprotobuf-all-3.12.4.tar.gz\n\n# 解压源码包\ntar -xzf protobuf-all-3.12.4.tar.gz\ncd protobuf-3.12.4\n\n# 配置（使用兼容的 C++标准）\n.\u002Fconfigure CXXFLAGS=\"-std=c++11\" --prefix=\u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.12.4\n\n# 编译（使用多线程加速）\nmake -j$(nproc)\n\n# 安装\nsudo make install\n\n# 创建符号链接\nsudo ln -sf \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.12.4\u002Fbin\u002Fprotoc \u002Fusr\u002Flocal\u002Fbin\u002Fprotoc\n\n# 验证安装\nprotoc --version\n\n# 清理\ncd ..\nrm -rf protobuf-3.12.4 protobuf-all-3.12.4.tar.gz\n```\n\n#### 编译安装 protoc 3.6.1（更旧版本）\n\n```bash\n# 安装依赖\nsudo apt update\nsudo apt install -y autoconf automake libtool curl make g++ unzip\n\n# 下载旧版本源码\nwget https:\u002F\u002Fgithub.com\u002Fprotocolbuffers\u002Fprotobuf\u002Freleases\u002Fdownload\u002Fv3.6.1\u002Fprotobuf-all-3.6.1.tar.gz\n\n# 解压\ntar -xzf protobuf-all-3.6.1.tar.gz\ncd protobuf-3.6.1\n\n# 配置和编译\n.\u002Fconfigure --prefix=\u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.6.1\nmake -j$(nproc)\n\n# 安装\nsudo make install\n\n# 创建符号链接\nsudo ln -sf \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.6.1\u002Fbin\u002Fprotoc \u002Fusr\u002Flocal\u002Fbin\u002Fprotoc\n\n# 验证\nprotoc --version\n\n# 清理\ncd ..\nrm -rf protobuf-3.6.1 protobuf-all-3.6.1.tar.gz\n```\n\n### 方法三：使用 Docker 容器\n\n如果系统兼容性问题过多，可以考虑使用 Docker 容器来隔离运行环境。\n\n```bash\n# 拉取包含旧版本 protoc 的镜像\ndocker pull namely\u002Fprotoc-all:3.12.4\n\n# 创建别名方便使用\necho 'alias protoc-old='\"'docker run -v $(pwd):\u002Fdefs namely\u002Fprotoc-all:3.12.4'\"'' >> ~\u002F.bashrc\nsource ~\u002F.bashrc\n\n# 使用示例\nprotoc-old -f your_file.proto --php_out=.  # 生成 PHP 代码\n\n# 或者直接使用完整命令\ndocker run -v $(pwd):\u002Fdefs namely\u002Fprotoc-all:3.12.4 -f message.proto --php_out=.\n```\n\n### 方法四：使用第三方仓库\n\n在某些情况下，可以尝试添加包含旧版本的第三方 PPA 或使用其他 Ubuntu 版本的仓库：\n\n```bash\n# 添加可能包含旧版本的 PPA（可能不适用于 Ubuntu 24.04）\nsudo add-apt-repository ppa:ubuntu-toolchain-r\u002Ftest\nsudo apt update\n\n# 尝试安装特定版本（如果仓库中可用）\nsudo apt install protobuf-compiler=3.6.1.3-2ubuntu5\n\n# 或者尝试从 Ubuntu 20.04 (Focal Fossa) 的仓库安装\necho \"deb http:\u002F\u002Farchive.ubuntu.com\u002Fubuntu focal main universe\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Ffocal.list\nsudo apt update\nsudo apt install protobuf-compiler=3.6.1.3-2ubuntu5 -t focal\n```\n\n## 多版本管理脚本\n\n为了更方便地管理和切换多个 Protocol Buffers 版本，可以创建一个简单的安装脚本：\n\n```bash\n#!\u002Fbin\u002Fbash\n# 文件: install_old_protoc.sh\n\nVERSION=$1\n\nif [ -z \"$VERSION\" ]; then\n    echo \"用法: install_old_protoc.sh \u003Cversion>\"\n    echo \"可用的旧版本: 3.12.4, 3.11.4, 3.10.1, 3.9.2, 3.8.0, 3.7.1, 3.6.1\"\n    exit 1\nfi\n\n# 检查版本是否受支持\ncase $VERSION in\n    3.12.4|3.11.4|3.10.1|3.9.2|3.8.0|3.7.1|3.6.1)\n        echo \"正在安装 protoc $VERSION...\"\n        ;;\n    *)\n        echo \"不支持的版本: $VERSION\"\n        exit 1\n        ;;\nesac\n\n# 尝试下载预编译版本\nwget https:\u002F\u002Fgithub.com\u002Fprotocolbuffers\u002Fprotobuf\u002Freleases\u002Fdownload\u002Fv${VERSION}\u002Fprotoc-${VERSION}-linux-x86_64.zip\n\nif [ $? -ne 0 ]; then\n    echo \"下载预编译版本失败，尝试从源码编译...\"\n    wget https:\u002F\u002Fgithub.com\u002Fprotocolbuffers\u002Fprotobuf\u002Freleases\u002Fdownload\u002Fv${VERSION}\u002Fprotobuf-all-${VERSION}.tar.gz\n    tar -xzf protobuf-all-${VERSION}.tar.gz\n    cd protobuf-${VERSION}\n    .\u002Fconfigure --prefix=\u002Fusr\u002Flocal\u002Fprotobuf\u002Fv${VERSION}\n    make -j$(nproc)\n    sudo make install\n    cd ..\n    rm -rf protobuf-${VERSION} protobuf-all-${VERSION}.tar.gz\nelse\n    # 安装预编译版本\n    sudo mkdir -p \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv${VERSION}\n    sudo unzip protoc-${VERSION}-linux-x86_64.zip -d \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv${VERSION}\n    rm protoc-${VERSION}-linux-x86_64.zip\nfi\n\n# 创建符号链接\nsudo ln -sf \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv${VERSION}\u002Fbin\u002Fprotoc \u002Fusr\u002Flocal\u002Fbin\u002Fprotoc\n\necho \"protoc $VERSION 安装成功!\"\nprotoc --version\n```\n\n使用方法：\n```bash\nchmod +x install_old_protoc.sh\n.\u002Finstall_old_protoc.sh 3.12.4  # 安装 3.12.4 版本\n.\u002Finstall_old_protoc.sh 3.6.1   # 切换到 3.6.1 版本\n```\n\n## 验证和测试安装\n\n安装完成后，建议进行以下验证和测试：\n\n```bash\n# 检查版本\necho \"当前安装的 protoc 版本: $(protoc --version)\"\n\n# 测试编译一个简单的 .proto 文件\ncat > test.proto \u003C\u003C 'EOF'\nsyntax = \"proto3\";\n\nmessage TestMessage {\n    string text = 1;\n    int32 number = 2;\n    bytes binary_data = 3;  \u002F\u002F 包含二进制字段\n}\nEOF\n\n# 编译测试文件\nprotoc --php_out=. test.proto  # 生成 PHP 代码\n# 或者使用其他语言: protoc --python_out=. test.proto\n\n# 检查生成的文件\nls -la GPBMetadata\u002F TestMessage.php\n\n# 验证二进制数据处理功能（通过检查生成的代码）\n# 此处应检查生成的代码中是否正确处理了 binary_data 字段\n\n# 清理测试文件\nrm -rf test.proto GPBMetadata\u002F TestMessage.php\n```\n\n## 注意事项\n\n在 Ubuntu 24.04 系统上安装旧版本 Protocol Buffers 时，需要注意以下几点：\n\n1. **依赖兼容性**：旧版本的 Protocol Buffers 可能与 Ubuntu 24.04 的较新库存在兼容性问题\n2. **C++ 标准**：一些旧版本可能需要特定的 C++ 标准才能正常编译\n3. **多版本管理**：建议使用符号链接方式管理多个版本，便于切换\n4. **隔离安装**：最好将旧版本安装在 `\u002Fusr\u002Flocal` 目录下，避免与系统包冲突\n5. **路径优先级**：确保 `\u002Fusr\u002Flocal\u002Fbin` 在系统 PATH 中的优先级高于可能包含新版本的路径\n\n## 推荐方案\n\n**对于 Ubuntu 24.04 系统，强烈推荐使用方法一（预编译二进制文件）**，原因如下：\n\n1. 避免复杂的依赖问题和编译错误\n2. 安装过程简单快速，无需等待长时间编译\n3. 不会影响系统中已安装的其他软件包\n4. 可以通过符号链接轻松管理和切换多个版本\n\n最简洁的安装命令（以 3.12.4 版本为例）：\n```bash\nwget https:\u002F\u002Fgithub.com\u002Fprotocolbuffers\u002Fprotobuf\u002Freleases\u002Fdownload\u002Fv3.12.4\u002Fprotoc-3.12.4-linux-x86_64.zip\nsudo unzip protoc-3.12.4-linux-x86_64.zip -d \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.12.4\nsudo ln -sf \u002Fusr\u002Flocal\u002Fprotobuf\u002Fv3.12.4\u002Fbin\u002Fprotoc \u002Fusr\u002Flocal\u002Fbin\u002Fprotoc\n```\n\n## 内容总结\n\n本文详细介绍了在 Ubuntu 24.04 系统上安装 Protocol Buffers 3.13 之前版本的多种方法，主要解决了新版本无法正确处理二进制数据转换为十六进制字符串的问题。文章提供了四种安装途径：预编译二进制文件（推荐）、源码编译安装、Docker 容器和第三方仓库，同时提供了多版本管理脚本和验证测试方法。\n\n对于大多数用户，推荐使用预编译二进制文件的方法，因为它简单可靠，能有效避免依赖问题。在需要频繁切换版本的场景下，可以使用文中提供的版本管理脚本提高工作效率。\n\n通过本文提供的方法，开发者可以在保持系统稳定性的同时，解决 Protocol Buffers 在处理二进制数据方面的兼容性问题，确保项目的正常运行。\n        ",null,0,76,"2025-09-13 10:33:57",66,"技术杂谈",{"id":20,"title":21},111,"Ubuntu系统安装Protocol Buffers (protobuf) 编译器完全指南",{"id":23,"title":24},113,"WSL与Linux子系统：在Windows上打造高效开发环境",[26,29,32],{"id":27,"name":28},91,"Ubuntu",{"id":30,"name":31},93,"Protocol",{"id":33,"name":34},39,"Linux",5172,12,"https:\u002F\u002Ftp.myong.top\u002Fstorage\u002Farticle\u002F20230407\u002Fe70ad72ca8f855e68e71fb0e124ede5a.jpeg",[39,44,49,54,59],{"id":40,"title":41,"create_time":42,"description":43},89,"获取腾讯“邮我”的链接","2020-06-16 10:47:34","腾讯QQ邮箱提供了“邮我”组件，可以放在自己的网站上，让别人点击提供的图片或者链接就可以发Email过来，该文章分享的是如何获取到其中的链接。",{"id":45,"title":46,"create_time":47,"description":48},98,"本站点JavaScript相关特效使用方法整理","2021-04-22 18:38:53","本站的页面用的特效有，粒子线canvas-nest，动态彩带canvas-ribbon，鼠标点击特效以及音乐播放器，本文整理了特效的使用方法",{"id":50,"title":51,"create_time":52,"description":53},106,"阿里开源数据同步组件Canal","2023-10-26 22:43:32","最开始听说canal是从mysql与redis双写一致性解决方案，当时并没有太在意，最近由于需要实时同步数据，如果在代码对insert\u002Fupdate\u002Fdelete做拦截也可以实现，但对代码侵入性太大了，并且后期更改时容易有遗漏，风险太高，这时就又想到了canal，canal的好处在于对业务代码没有侵入，因为是基于监听binlog日志去进行同步数据，这个真的是太爽爽爽了。并且实时性也能做到准实时，这也是canal为什么这么流行，因为确实很多企业会用来做数据同步的方案。",{"id":55,"title":56,"create_time":57,"description":58},62,"内网使用Composer","2019-10-08 23:29:23","最近本地部署Laravel开发环境时，遇到公司的内网无法正常使用Composer下载Laravel，后来发现是要设置公司内网代理",{"id":60,"title":61,"create_time":62,"description":63},75,"Hexo-SEO优化开启静态文件压缩功能","2019-12-30 21:34:32","个人对HEXO搭建博客的SEO优化方案进行总结，从本地的文章结构到定期推送，再到SEO关键词优化做一个全面体系的汇总，如果有更好的方法可以私聊我。\n\n",1783431653392]