Ubuntu:常用的需要进行多版本管理的库(eigen3/protoc/gcc)


一 eigen3的双版本管理 首先,通过

sudo apt-get install libeigen
来安装的eigen3,默认安装在/usr/include下,查看此处的版本可用:
gedit /usr/include/eigen3/Eigen/src/Core/util/Macros.h
而通过源码安装,即在官方源码地址:http://eigen.tuxfamily.org/index.php?title=Main_Page
下载,然后解压,cd进解压后的文件夹,执行:
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/include/eigen3 ..
make
sudo make install
将会安装在/usr/local/inculde下 ,当然,也可以通过指定DCMAKE_INSTALL_PREFIX=/usr/include/eigen3 来安装在/usr/include目录下


如何进行双版本管理呢,以在/usr/include下进行版本为例(这样更加方便,不需要在cmakelist里指定eigen3的搜索路径)
首先,查看当前/usr/include/eigen3中的eigen3版本,发现:
#ifndef EIGEN_MACROS_H
#define EIGEN_MACROS_H
#define EIGEN_WORLD_VERSION 3
#define EIGEN_MAJOR_VERSION 3
#define EIGEN_MINOR_VERSION 7
也即,其版本为337
所以在/usr/include目录下:
sudo mkdir eigen337
然后,选择准备安装的第二个版本,例如eigen316,在同一目录下:
sudo mkdir eigen316
下载eigen316源码压缩包,压缩,然后在编译时制定安装位置为:
cmake -DCMAKE_INSTALL_PREFIX=/usr/include/eigen316/eigen3
其他不变


这样,当我们想使用eigen316版本时:
移入
sudo mv eigen3 eigen337
移出
sudo mv eigen316/eigen3 .
也就是,把当前eigen3中的内容移到eigen337中保存,然后把eigen316中的内容移出至/usr/include


特别的,在进行这样的操作之后,有时会出现在cmakelist中include 然后编译时依然报错版本不对
这是因为,cmake会第一时间先去以下文件夹:/usr/lib/cmake,找eigen库对应的:EigenConfig.cmake,而这里面的版本没有被修改
解决方式也简单,直接把/usr/lib/cmake下的eigen文件夹删除即可(cmake依然可以找到eigen库)
【Ubuntu:常用的需要进行多版本管理的库(eigen3/protoc/gcc)】

二 protoc 首先用:
protoc --version
可以查看当前电脑上的protoc版本,例如查得当前版本为protobuf3.6.0
为了与后面的proto另一版本区别,建立软链接:
sudo ln /usr/local/bin/protoc /usr/local/bin/protoc3.6
sudo rm -rf pprotoc# 删除protoc的软链接
protoc3.6--version# 通过新创建的软链接查看protoc版本
以后,就用protoc3.6 --version来查看protoc版本


现在安装第二版protoc:
下载地址:Protocol Buffers v3.6.0。例如选择的是protobuf2.6;
解压缩protobuf-all-2.6.0.tar.gz并移动到合适的文件夹,然后:
tar -zxvf protobuf-all-2.6.0.tar.gz
sudo cp -rf protobuf-2.6.0 /usr/local
cd /usr/local
sudo chmod -R 0777 protobuf-3.6.0


然后安装:


cd protobuf-2.6.0
./autogen.sh
./configure--prefix=/usr/protobuf# 为了与protobuf-3.6.0分开来,设定配置目录
make
make check
sudo make install
然后创建软连接:
sudo ln -s /usr/protobuf/bin/protoc /usr/local/bin/protoc2.6
现在即可用protoc2.6 --version来查看protoc第二个版本


如何使用呢,我们现在来到/usr/local/bin目录
发现里面会有:protoc,protoc2.6,protoc3.6三个软连接。
如果现在准备使用2.6版本在目录下:
sudo rm protoc
sudo ln /usr/local/bin/protoc2.6 /usr/local/bin/protoc
这时,用protoc --version 显示的就是2.6版了,如果想用3.6版本也是同样操作


三 gcc 一个小问题,有时会有这样的报错:unsupported GNU version! gcc versions later than 6 are not supported!
实际上是CUDA9.1不支持高版本的gcc,而你本机上就是高版本的gcc
解决方法:
sudo update-alternatives --install/usr/bin/g++ g++ /usr/bin/g++-6 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 10
即可切换至gcc6后面的10是优先级,也就是说如果想切换回gcc7:
sudo update-alternatives --install/usr/bin/g++ g++ /usr/bin/g++-7 11
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 11
最好将优先级增大一点,以此类推
设置后,用gcc --verison查看当前版本

    推荐阅读