室内定位仿真:cartographer和Gazebo 编译依赖的protoc版本不同解决方法

问题:

1、cartographer依赖的protoc版本是3.0以上

2、Ubuntu 16.04下Gazebo依赖的protoc版本是2.6.1

那么怎么解决这两个版本兼容问题呢?

解决:新版本会与旧版本冲突.为了兼容新旧两种版本,需要新版本的protobuf安装在非默认位置.

操作:

1、下载所需版本的protobuf

最新版:https://github.com/protocolbuffers/protobuf

ROS kinectic是默认自带protoc 2.6.1的

which protoc

可以看到输出的默认路径在/usr/local/protobuf/

protoc --version

查看那些路径安装了protoc

whereis protoc

 

默认版本号是2.6.1 的

2、下面安装3.7.1的,下载好安装包之后解压

cd protobuf
./autogen.sh
./configure --prefix=/home/physics/local_install/    #修改默认安装位置
make -j8
make install 

3、这样就安装到“home/phsics/local_install”了,为了能在命令行中运行我们将该目录安装在path中,把路径加载到环境变量中

sudo gedit ~/.bashrc

在最后添加以下内容 

####### add protobuf lib path ########
export PATH=~/local_install/bin/:$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/
######################################

然后更改那个需要编译里面依赖非默认版本的protoc的包的Cmake文件,在文件中添加以下两句

INCLUDE_DIRECTORIES(/your_path/include/)
LINK_DIRECTORIES(/your_path/lib/)

这样在编译的时候就能找到刚刚新安装的protoc了


出现问题:

Protobuf cannot find shared libraries:  ……

就是说没找到那个共享链接库,注意这里要看清楚是哪个没找到,不同版本的protoc对应的共享动态链接库也是有不同的,它的后缀带有版本数字的,看清楚之后重新安装,然后在bashrc文件里面添加进路径就好了。 

解决:

cd protobuf
sudo make uninstall
sudo make distclean
./configure

参考:https://stackoverflow.com/questions/25518701/protobuf-cannot-find-shared-libraries


卸载protoc:

sudo apt-get remove libprotobuf-dev
which protoc
rm protoc的路径  // 具体路径以“which protoc”或者是你想要卸载那个版本的路径显示的为准s
到此,protobuf卸载完成。

参考:https://blog.csdn.net/FK2016/article/details/83375048

你可能感兴趣的:(PX4开发)