鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

Protobuf源码安装指导

当前发布版本需要用户手动安装Protobuf,推荐以源码编译的形式安装,安装步骤如下所示。

  1. 下载Protobuf和编译依赖的Abseil源码包,两个源码包放在同一目录。
  2. 解压源码包。
    tar -zxvf abseil-cpp-20230802.2.tar.gz
    tar -xzf protobuf-25.1.tar.gz
    mv abseil-cpp-20230802.2/* protobuf-25.1/third_party/abseil-cpp/
    cd protobuf-25.1
  3. 生成编译配置,用户可通过--prefix指定安装路径。推荐安装在系统目录下。
    mkdir build && cd build
    cmake .. -DCMAKE_INSTALL_PREFIX=/usr -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_SHARED_LIBS=ON -DCMAKE_CXX_STANDARD=17
  4. 编译protoc及Protobuf runtime。
    make -j

    可使用多线程编译提高编译速度,其中{n}根据设备性能进行选择。

    make -j {n}
  5. 安装protoc及Protobuf runtime,并刷新动态库配置缓存。
    # 非root账号需要使用sudo安装
    sudo make install
    sudo ldconfig
    • 若用户指定安装目录为/usr,则protoc安装在“/usr/bin”目录下,libprotobuf.a & *.so安装在“/usr/lib”目录下。
    • 若用户指定安装路径非系统目录,则需要将bin和lib路径导入到环境变量,示例如下所示。
      # 若指定--prefix=/path/to/protobuf
      export PATH=/path/to/protobuf/bin:$PATH
      export LD_LIBRARY_PATH=/path/to/protobuf/lib:$LD_LIBRARY_PATH
  6. 执行以下命令,查看版本。
    若打印版本信息,表示安装成功。
    protoc --version
    # libprotoc 25.1
  7. 进行软链接。
    1. 观察打印信息,发现关键词“version 'GLIBCXX_3.4.29' not found”,请执行步骤7.b
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libprotoc.so.25.1.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libprotobuf.so.25.1.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_log_internal_message.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_log_internal_log_sink_set.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_flags_marshalling.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_flags_reflection.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_status.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_cord.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_cordz_handle.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_crc_cord_state.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_str_format_internal.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /usr/bin/../lib64/libabsl_synchronization.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_strings.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_time_zone.so.2308.0.0)
    2. 将/usr/lib64/libstdc++.so.6软链接到libstdc++.so.6.0.29及以上。

      例如环境已经按照要求安装了GCC 12.3.0,可以执行以下命令进行软链接:

      sudo ln -sf /usr/local/gcc-12/lib64/libstdc++.so.6.0.30 /usr/lib64/libstdc++.so.6

      使用软链接替换libstdc++.so后,若执行yum、rpm等命令,可能会重置该软链接,导致编译固件过程中报错。当出现“version 'GLIBCXX_3.4.29' not found”报错时,请重新执行步骤7.b