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

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
`#include <google/protobuf/port_def.inc>` 是 Protocol Buffers (Protobuf) 库中的一个预处理指令,用于包含 Protobuf 系统内部使用的端口定义文件。这个文件主要用于配置跨平台兼容性和一些宏定义,以确保 Protobuf 在不同平台上都能正常工作。 ### 详细解释 1. **作用**: - `port_def.inc` 主要负责定义一系列与平台相关的宏和变量。例如,它会检测当前编译环境的操作系统、处理器架构等信息,并据此设置相应的标志位或参数。 2. **内容概述**: - 文件中包含了针对不同操作系统的特殊处理逻辑,比如 Windows 和 Unix/Linux 平台之间的差异性支持;还涵盖了字节序(大端法 vs 小端法)、整型大小等问题的适配方案。 - 此外,该文件还会根据编译器的不同版本做出相应调整,保证代码可以在多种主流编译环境下顺利编译并运行良好。 3. **应用场景**: - 当你在编写基于 Protobuf 的应用程序时,默认情况下不需要直接引用此头文件,因为它通常是作为 Protobuf 内部组件的一部分自动引入的。 - 只有当你深入研究 Protobuf 源码或参与其开发维护时才会接触到此类底层细节。 4. **注意事项**: - 由于这是一个非常底层的技术实现层面的内容,普通开发者一般无需关心具体的实现细节,只要按照官方文档指导使用即可。 - 修改这类核心库的源码应当格外谨慎,除非确实了解其中的工作机制并且能够承担潜在的风险。 --- 为了更好地理解这一部分的作用,可以参考一下实际项目里是如何调用它的例子: ```cpp // 示例:在 .proto 文件生成的 C++ 代码开头处可能会看到类似这样的导入语句 #include <google/protobuf/port_def.inc> namespace google { namespace protobuf { class MyClass { public: // ... 类成员函数及数据成员声明 ... }; } // namespace protobuf } // namespace google #include <google/protobuf/port_undef.inc> ``` 在这个例子中,可以看到 `<google/protobuf/port_def.inc>` 被放置于命名空间之前,这表明它是整个 Protobuf 库初始化过程中最早加载的部分之一,用于设定全局性的编译选项和其他必要的准备工作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值