Ubuntu同时兼容两个版本protoc
前言
想不到啊,今天的进展可以让我写两篇随笔。这次攻克的是一个系统下兼容两个protoc的问题,并且可以在使用不同版本的protoc的时候随时切换!因为carto编译的protoc是3.4.1版本的,但是考核材料编译的版本是3.0.0版本的,也就是Ubuntu18默认自带的版本。所以很有必要系统中兼容两个protoc,顺利解决!
补充
过了好久才知道,原来carto所需要的protocbuf版本和qingzhou以及ubuntu18原生的protobuf是不冲突的!!!!所以下面的其实是白折腾...
不过好在也可以为自己修改protubuf版本积累经验,包括删除旧protubuf和下载新的protubuf:protubuf—全面 !!!
下载protoc
首先在主目录下下载protoc源码,这里推荐用小梯子下载,亲测在网址前面加gitclone.com是没用的,后面会导致编译失败,小梯子也会遇到下载失败的问题,多试几次就好了。
点击查看代码
##### git protobuf源码
git clone https://github.com/google/protobuf.git
cd protobuf
##### 修改protobuf版本为v3.0.0,安装时会自动安装3.0.0
git checkout tags/v3.0.0
git checkout -b v3.0.0
./autogen.sh
##### 修改安装路径
./configure --prefix=/home/yours/local_install/protocbuff/ #yours是你对你计算机取的名字
##### 编译protobuf源码
make -j8
##### 安装protobuf3.0.0
make install
这里要注意需要自己指定下载protoc的地址,比如上面给出的就是/home/yours/local_install/protocbuff/
,这个地址随意指定,只要记住就行;
其次在执行autogen.sh
的过程中可能会出现编译失败的问题,我们需要下载gmock,具体步骤在后面给出,具体解决方法在下一步。
下载gmock
如果上一步执行autogen.sh
没有问题,跳过此步
首先下载gmock源码
git clone https://github.com/paulsapps/gmock-1.7.0
移动gmock并重命名
将gmock文件夹拷贝到protobuf目录下,改名为gmock
注释代码
gedit autogen.sh将如下代码注释:
点击查看代码
if test ! -e gmock; then
echo "Google Mock not present. Fetching gmock-1.7.0 from the web..."
curl -O https://googlemock.googlecode.com/files/gmock-1.7.0.zip
unzip -q gmock-1.7.0.zip
rm gmock-1.7.0.zip
mv gmock-1.7.0 gmock
fi
重新执行autogen.sh
在protoc目录下执行./autogen.sh
环境变量
这样就把所需要的protoc版本下载好了,一个是系统自带的,一个是carto编译需要的,一个是考核材料编译需要的,分别处在不同的位置
给程序包CMake文件添加内容
给要指定编译的程序包的CMakel.list文件添加内容,比如我的是qingzhou工作空间,我就在qingzhou/src下的CMakelist的文件开头添加(这其中的路径根据自己前面下载protoc的路径来设置):
点击查看代码
###################################################
INCLUDE_DIRECTORIES(/home/cy/local_install/protocbuff/include/)
LINK_DIRECTORIES(/home/cy/local_install/protocbuff/lib/)
###################################################
添加好之后是这样的,具体位置如下:
点击查看代码
cmake_minimum_required(VERSION 3.0.2)
###################################################
INCLUDE_DIRECTORIES(/home/cy/local_install/protocbuff/include/)
LINK_DIRECTORIES(/home/cy/local_install/protocbuff/lib/)
###################################################
project(Project)
环境变量脚本
同时在该工空间下创建一个环境变量脚本,每次需要编译这个工作空间的时候就执行这个脚本就可以了,比如在qingzhou工作空间下创建一个脚本touch qingzhou.sh
在脚本中输入命令,这其中的路径根据自己前面下载protoc的路径来设置:
点击查看代码
####编译PX4时,将如下内容注释掉,编译cartographer时,将如下内容打开
####### add protobuf lib path ########/home/qjny/local_install/lib
export PATH=/home/cy/local_install/protocbuff/bin/:$PATH
#(动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/cy/local_install/protocbuff/lib/
#(静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/home/cy/local_install/protocbuff/lib/
#执行程序搜索路径
export PATH=$PATH:/home/cy/local_install/protocbuff/bin/
#c程序头文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/home/cy/local_install/protocbuff/include/
#c++程序头文件搜索路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/home/cy/local_install/protocbuff/include/
#pkg-config 路径
export PKG_CONFIG_PATH=/home/cy/local_install/protocbuff/lib/pkgconfig/
######################################
使用
然后正常的话,在编译其他东西,比如carto的时候,我们使用默认的protoc,输入protoc --version
出来的是3.4.1;在编译这个工作空间,比如qingzhou的时候,我们使用指定的protoc,需要先source环境变量脚本:source qingzhou.sh
之后,再输入protoc --ersion
出来的就是3.0.0,也就是我们需要的版本~
而且另外说一句,这种方法下载的protoc在其它地方查找protoc的时候是不会出现的,也就是说在其他地方使用whereis protoc
的时候,不会出现我们自己下载的protoc,独立性非常好
后记
所以说今天重装一次系统,就是因为这个东西protoc版本不兼容导致不能编译,但是其实重装之后没有多大改变。想了一下,感觉前面失败的原因还是因为下载protoc的时候使用在网址前面加上gitclone.com的旁门左道...其实有小梯子的话下载很好下载的,无非多下载几次而已...汗颜自己居然没想到这个,花费了那么多时间😅
所以以后遇到问题不要无脑冲,也不要着急上网查,先自己分析一下可能的原因,尝试去解决。其次要相信自己的亲身测试过的东西,在网络查阅资料也不能人云亦云,也要有自己的判断。