google/protobuf/port_def.inc: no such file or directory

文章讲述了在遇到protobuf的port_def.inc文件缺失错误时,问题的原因是protoc版本与头文件版本不一致。解决方案包括检查并更新protoc版本,确保与pb文件生成版本匹配,以及如何正确卸载和安装protobuf的不同版本,以解决编译冲突问题。

1. 问题

xxx.pb.h: fatal error: google/protobuf/port_def.inc: no such file or directory

2. 原因

protoc 与 头文件版本不匹配,port_def.inc是protobuf3.7.0版本之后才有的

3. 解决方法

更新protoc版本
如果不是重新生成.pb文件,注意protoc版本要统一

1. 查看生成.pb文件的protoc版本(编译环境)
    protoc --version
    
2. 比如原始编译版本是3.12.3,在官网下载对应版本
https://pypi.org/project/protobuf/

3. 按照如下命令安装

    cd protobuf-xxx
    ./autogen.sh
    ./configure
    make            // 耗时较长
    make check      // 非必须
    sudo make install
    sudo ldconfig

重新编译cartographer,如果报错,往下看。

4. 其他问题

如果更新的protoc版本和头文件编译版本不匹配,可能编译会报如下错误

xxx.pb.h: #error this file was generated by an older version of protoc …
#error incompatible with your Protocol Buffer headers.
#error please regenerate this file with a newer version of protoc
  • 解决办法

卸载protoc重新安装指定版本,指定版本下载安装上面介绍过了

protobuf的卸载

sudo apt-get remove libprotobuf-dev

which protoc    // 查看可执行文件路径

sudo rm /usr/local/bin/protoc           // 删执行文件
                                        //(也可能是/usr/bin/protoc)
sudo rm -rf /usr/local/include/google   //头文件

sudo rm -rf /usr/local/lib/libproto*    //库文件

sudo ldconfig,动态链接库为系统所共享,即应用程序能正确找到相关链接库文件。不执行这步可能报错:

protoc: error while loading shared libraries: libprotoc.so.23: cannot open shared object file: no such file or directory
### 问题分析 当遇到 `google/protobuf/port_def.inc: no such file or directory` 或类似的错误时,通常是因为编译器无法找到指定的头文件。这可能是由于以下几个原因: 1. 头文件未正确安装或缺失。 2. 编译配置中缺少必要的头文件搜索路径设置。 3. 系统环境变量未正确配置。 以下是针对该问题的具体解决方案及其背景说明。 --- ### 解决方案 #### 方法一:确认并安装 Protobuf 开发库 如果系统中尚未安装 Protobuf 的开发包,则需要通过以下命令完成安装[^3]: ```bash sudo apt-get install libprotobuf-dev protobuf-compiler ``` 上述命令会安装 Protobuf 库以及其对应的头文件和编译工具链。此操作适用于基于 Debian 和 UbuntuLinux 发行版。 #### 方法二:验证头文件是否存在 在某些情况下,虽然头文件已存在,但由于编译器未能正确识别路径而引发错误。此时可以手动检查目标文件的位置: ```bash ls /usr/include/google/protobuf/ ``` 若发现 `port_def.inc` 文件确实不存在,则需重新执行方法一步骤以确保完整的 Protobuf 安装。 #### 方法三:调整 CMake 配置中的头文件路径 对于使用 CMake 构建系统的项目,可以通过显式声明头文件路径来解决问题。具体做法是在项目的根级 CMakeLists.txt 中加入以下语句[^2]: ```cmake include_directories(${PROTOBUF_INCLUDE_DIR}) ``` 其中 `${PROTOBUF_INCLUDE_DIR}` 是由 CMake 自动检测到的 Protobuf 包含目录位置。如果自动检测失败,也可以手动指定路径,例如 `/usr/include`. #### 方法四:利用 apt-file 工具定位丢失的文件 为了更精确地诊断哪些软件包提供所需的头文件,可借助于 `apt-file` 工具进行查询[^4]: ```bash sudo apt-get install apt-file sudo apt-file update apt-file search port_def.inc ``` 以上命令将返回包含所需文件的相关软件包名称。随后可根据提示安装对应依赖项。 #### 方法五:清理旧版本冲突 有时多个不同版本的 Protobuf 可能共存于同一台机器上,从而引起兼容性问题。建议先卸载现有版本再重试最新稳定发行版: ```bash sudo apt-get remove --purge libprotobuf* protobuf* sudo apt-get autoremove sudo apt-get install libprotobuf-dev protobuf-compiler ``` --- ### 总结代码片段 综合考虑各种情况下的修复措施后,推荐按照下列顺序尝试处理此类问题: ```bash # 步骤A - 更新APT索引并安装必要组件 sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install -y build-essential cmake git pkg-config \ libprotobuf-dev protobuf-compiler # 步骤B - 使用APT-FILE排查特定文件归属关系 sudo apt-get install -y apt-file sudo apt-file update apt-file search google/protobuf/port_def.inc # 步骤C - 修改CMAKE脚本增加INCLUDE_DIRECTORIES指令 set(PROTOBUF_ROOT "/path/to/your/custom/installation") find_package(Protobuf REQUIRED) if (NOT PROTOBUF_FOUND) message(FATAL_ERROR "Failed to locate Protobuf installation.") endif() include_directories(${PROTOBUF_INCLUDE_DIRS}) # 步骤D - 清理残留数据防止干扰新部署流程 sudo rm -rf /var/lib/apt/lists/* sudo apt-get clean all ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值