编译ColmapForSat遇到的问题

Ubuntu20.4环境下编译改编版本的Colmap遇到的问题

问题一:ubuntu_install_colmap.sh文件中明确写道使用gcc-6,g++ -6进行编译

  1. 首先使用从安装gcc-6开始,但是遇到了许多问题,网上大多数都是Ubuntu18.04或者更低版本的Ubuntu编译版本,相对来说大多数成功的条件就是Ubuntu版本低,升级gcc版本自然就比较容易。gcc4.8编译为gcc6.3 但是这里问题就来了,使用sudo apt-get install gcc-6 g+±6或者说更低的版本,都会显示如下一个问题。
    编译ColmapForSat遇到的问题_第1张图片
    实际上我们都知道,这里该添加源进行增添,以前老版本(gcc7以下的)根本没有在默认搜索通道中。
  2. 添加搜索通道,可以参考Ubuntu20.04添加低版本搜索通道,但是呢,这个也仅仅只能解决一个问题,我们的gcc-5系列可以安装但是对于解决需要gcc-6环境的编译项目也是无能为力。gcc-6版本默认的环境是C++14,即我们完全可以省去相关库的不兼容问题。
#下面的gedit是Linux自带的,可替换为vim编辑器更快捷
sudo gedit /etc/apt/sources.list
#添加apt-get的搜索路径
deb http://dk.archive.ubuntu.com/ubuntu/ xenial main
deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe
#安装gcc-5 以及g++-5
sudo apt-get install g++-5 gcc-5
#默认情况下gcc是被安装在/usr/bin里面
# 设置优先级
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 100
# 经过上面的步骤gcc-9就被替换为了gcc-5,g++当然也做了相应的变换,上述只针对第一次使用这个命令起作用
  1. 使用gcc-5编译ColmapForSat遇到各种std::xxxx不存在问题,其中中途有一个很好的博客记录了其中一个错误的实质以及相关的解决办法。实质就是我们的eigen3.3.7与我们的ceres高版本之间会存在一些冲突问题,唯一的办法就是降低我们的ceres库。具体方法请看eigen库与ceres库之间发生冲突。实际上我虽然解决了上述问题CGAL库又出现了问题,同样是各种冲突,看网上的解决办法是只有低版本的gcc-6,gcc-5才会出现此类问题,于是我就陷入了死循环了,明明降低版本就是为了满足编译要求防止多个std::xxxx没有,结果现在又要我提高gcc版本。后面看到某个博客在CMakeList中加入# set(CMAKE_CXX_STANDARD 14)可解决问题,但是随之而来的是解决了这个库的问题另外一堆库又出现了问题。下面是切换gcc版本的方法。
# 输入下面的命令,输入数字即可进行gcc版本的选择
sudo update-alternatives --config gcc
  1. 还有一些方法就是手动编译gcc6,这里具体介绍网上编译gcc6的普遍套路,第一种:完全手动编译gcc6.3,第二种:大概就是更优秀的方法,就是contrib目录下可以直接帮我们继续上述依赖包的配置。本人亲测,上面的两种方法都不会成功的(针对于Ubuntu20.04)。它会出现一些列高版本的gcc9编译低版本的gcc问题,虽然你解决了一个或者两个问题,但是随之而来的是一堆问题,而且这些问题根本不是你我这种C++小白可以解决的,解决bug全是英文资料可供参考。
  2. 最后通过老师指定的稳定版本的environment-fixed-linux.yml文件搭建起了环境,这里推荐朋友们用虚拟机做好备份,不然改了代码之后又要重新配置环境是极其慢的。其中遇到的一个问题就是老师的库缺少freeimage库,但是最好的方法就是直接去Anaconda官网进行相关搜索在环境中安装才是最好的。Anaconda相关命令,其实经过这么多门语言的学习,发现Java的Maven库和Anaconda的这个库实在是太像太像了。
    ** 首先两者都是各个语言的库,比如Anaconda是Python和C++之类语言的库,Maven是Java语言的导包的工具库,在Anaconda中环境的创建被称作是在本地创建一个超链接,链接的对象就是相关目录下的pkgs,而Maven也是一样,第一次利用Idea创建Maven项目的时候会等待很长很长的时间,原因就是我们的Maven工具会把我们创建项目必要的一些下载到我们的本地仓库,然后需要任何依赖的时候Maven工具会首先从本地环境(仓库)中寻找相关的包,如果没有就在远程镜像中进行查找,最后才会轮到Maven的Apache主仓库进行查找并下载到.m2目录下。而我们的Anaconda也是这么一个道理,所有的包都存在本地一个叫做pkgs文件下进行存储,当我们需要创建项目的环境的时候,首先需要从pkgs中进行查找,然后没有的相关包就会在对应的搜索通道中进行查找,当然这里的通道也包括一些镜像源的搜索通道。和Maven工具settings.xml中配置的原理简直神似。
    对于添加包的方式我也来讲讲我对两者共性的理解,首先讲讲Java,它是直接在Pom.xml文件中添加dependency标签进行添加,然后就直接引入了我们的项目中,完全省去了我们添加到库的操作。其实哈,Java还算比较简单的了,对于C++大型项目来说就不是简简单单的添加附加库目录、包含目录几个简简单单几次鼠标就可以解决的问题,配置库是非常繁琐的,那么Anaconda创建的项目依赖环境以及CMake工具就共同解决了Maven工具对Java项目(包含Javaweb)所作的事。Anaconda为CMake寻找包提供了便捷性,方面包的管理,而CMake所做的贡献就是编译生成MakeFile,然后给Visual Studio生成sln工程顺便链接好对应的库操作。 **
  3. 最后生成ColmapForSat时候,出现了最后一个BUG,就是error: ‘vl_infinity_d’ not specified in enclosing ‘parallel’,经过英文资料的参考得以解决。
  4. 但是接下来你又会遇到一些问题,所以请在CMakeLists.txt添加set(CMAKE_CXX_STANDARD 14)设置C++14标准
删除掉vl/kmeans.c中所有的default(none),具体删除的方法可以直接使用vim在命令行状态输入`/***`进行查找输入
  1. 最后的安装直接就是sudo make install即可,这里可能很多人就会感到疑惑这么使用make install到底是安装在Linux哪个文件下呢?
    这个主要有两个安装目录,第一:如果你是从源代码进行编译安装那么默认文件夹就是/usr/local/bin目录下,如果你是通过·sudo apt-get install xxx,那么该文件自动被安装在/usr/bin下。
  2. 折腾了一圈因为我起初并没有安装NVDIA和cuda,然后提取到的点就是空,后面安装完毕之后又给我报linux-gnu-gcc9.3内部错误,显然是不可靠的。错误中提到constexpr不是表达式,那必然是std问题,结果打开内层的src下面的CMakeLists.txt最后发现竟然是它写了c++11
    编译ColmapForSat遇到的问题_第2张图片
复现代码过程中的错误

编译ColmapForSat遇到的问题_第3张图片
编译ColmapForSat遇到的问题_第4张图片
编译ColmapForSat遇到的问题_第5张图片
编译ColmapForSat遇到的问题_第6张图片
编译ColmapForSat遇到的问题_第7张图片
编译ColmapForSat遇到的问题_第8张图片
编译ColmapForSat遇到的问题_第9张图片
编译ColmapForSat遇到的问题_第10张图片
编译ColmapForSat遇到的问题_第11张图片
编译ColmapForSat遇到的问题_第12张图片
编译ColmapForSat遇到的问题_第13张图片
编译ColmapForSat遇到的问题_第14张图片
编译ColmapForSat遇到的问题_第15张图片
编译ColmapForSat遇到的问题_第16张图片

你可能感兴趣的:(ubuntu)