1.问题描述
总的来说编译protobuf文件时一般会遇到两种版本相关的错误
问题1:一种是编译的文件使用的新版本的protobuf,而你使用的是旧版本的protobuf
#error This file was generated by a newer version of protoc which is
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
问题2:另外一种是编译的文件使用的旧版本的protobuf,而你使用的是新版本的protobuf
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
2.问题分析
出现上述两种错误的原因很简单,就是使用protobuf版本的问题.
ROS (我使用的是kinetic) 自带有protobuf 2.6.1版本,在使用新版本的protobuf (例如3.5.1) 时,新版本会与旧版本冲突.为了兼容新旧两种版本,需要讲新版本的protobuf安装在非默认位置.
3.解决方案
3.1. 新版本protobuf安装方法
3.1.1. 下载所需版本的protobuf
下载所需版本的protobuf (protobuf官方git下载地址)
3.1.2. 下载所需的其他文件
./autogen.sh
3.1.3. 修改安装路径(修改安装路径,不能安装在默认路径下,否则会与ROS自带的protobuf版本冲突)
./configure --prefix=/my_path/
例如:./configure --prefix=/usr/local/protobuf/
3.1.4. 编译安装
make
make check
sudo make install
3.1.5. 配置环境变量
对应3.1.3. 中的安装路径/usr/local/protobuf/
####### add protobuf lib path ########
#(动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
#(静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
#执行程序搜索路径
export PATH=$PATH:/usr/local/protobuf/bin/
#c程序头文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
#c++程序头文件搜索路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
#pkg-config 路径
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
######################################
3.2. ROS中使用新版本protobuf (主要解决问题1)
CMakeLists.txt中添加编译路径
指定protobuf路径
INCLUDE_DIRECTORIES(/my_path/include/)
LINK_DIRECTORIES(/my_path/lib/)
引入protobuf
target_link_libraries(
${catkin_LIBRARIES}
protobuf
)
3.3. 使用旧版本protobuf (主要解决问题2)
我自己在安装新版本protobuf的时候傻逼的将新版本安装在了默认路径,结果导致旧版本的protubuf用不了,因此就重新安装了旧版本的protobuf,旧版本的protobuf版本号为protobuf` 2.6.1 .该版本可以直接在protobuf官方git下载地址下载,安装方式使用默认安装路径,具体的安装过程不在叙述.