Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)

目录

  • 1 编译 Matterport3D Simulator 源码
    • 1.1 源码下载
    • 1.2 Configure 过程
      • 1.2.1 添加 OpenCV_DIR
      • 1.2.2 将 pkg_check_modules 换为 find_package
      • 1.2.3 添加 JSONCPP_DIR
      • 1.2.4 添加 glew 路径
      • 1.2.5 指定 Python 解释器
      • 1.2.6 指定 CMAKE_BUILD_TYPE
    • 1.3 编译过程
      • 1.3.1 编译 MatterSim 工程
        • 1.3.1.1 fatal error C1083: Cannot open include file:
        • 1.3.1.2 error C2131: expression did not evaluate to a constant
        • 1.3.1.3 error C2065: 'M_PI': undeclared identifier
        • 1.3.1.4 error LNK2019: unresolved external symbol
      • 1.3.2 编译 mattersim_main 工程
      • 1.3.3 编译 test 工程
      • 1.3.4 编译 MatterSimPython 工程
    • 1.4 总结


1 编译 Matterport3D Simulator 源码

  在 Windows 下编译 Matterport3D Simulator 稍微有些不方便,需要对 CMakeLists.txt 进行一些修改,如果有更好的方法欢迎大家评论。

1.1 源码下载

  还是直接在 Github 上搜索 Matterport3D Simulator 的 repo,下载源码。

  • 如果用 zip 方式,在下载完该压缩包后,还需要点击 pybind11 @ 86e2ad4,跳转到 pybind11 的 repo 下载源码,如下
    Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第1张图片
    Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第2张图片
      然后将 pybind11 的源码解压到 Matterport3D Simulator 源码根目录的 pybind11文件夹下。
  • 如果使用 git 下载,使用如下命令,并且一定要加上--recursive选项。
git clone --recursive https://github.com/peteanderson80/Matterport3DSimulator.git

  最终,源码的根目录和 pybind11 目录如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第3张图片
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第4张图片

1.2 Configure 过程

  准备好源码后,打开 CMake gui,设置好源码路径编译路径,如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第5张图片
  然后点击 Configure 进行配置,并在弹出的对黄框中选择 Visual Studio 和 x64
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第6张图片
  不出意外,报错了,看一下报错信息,
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第7张图片
  原因是找不到 OpenCV,需要我们设置 “OpenCV_DIR” 为包含 OpenCVConfig.cmake 的路径,这是需要修改的第一个地方。

1.2.1 添加 OpenCV_DIR

   打开之前下载安装的 OpenCV 的根目录,在 “build\x64\vc15\lib” 目录下有 OpenCV 提供的 OpenCVConfig.cmake
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第8张图片
  只需要将该目录的绝对路径设置到 CMakeLists.txt 中即可,打开 Matterport3D Simulator 根目录下的 CMakeLists.txt 文件,在 find_package(OpenCV REQUIRED) 上面添加一句

set(OpenCV_DIR D:/1-Compiler/dependency/opencv/build/x64/vc15/lib)

  后面跟的是你自己对应的绝对路径,注意要使用 ‘/’ 而不是 ‘\’,如下所示
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第9张图片
  保存后回到 CMake gui再次配置,上述错误跳过。但不出意外,再次报错,信息如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第10张图片
  提示我们找不到 PkgConfig,解决办法一是安装 PkgConfig,但是我没找到在 Windows 下使用 PkgConfig 的好方法,所及直接将 PkgConfig 改为功能相似的 find_package 命令,这是第二个修改的地方。

1.2.2 将 pkg_check_modules 换为 find_package

  首先将 find_package(PkgConfig REQUIRED)直接注释,然后将

pkg_check_modules(JSONCPP REQUIRED jsoncpp)

  改为

find_package(JSONCPP REQUIRED jsoncpp)

  更改结果如下所示,如果有更好的解决方法欢迎评论告知。
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第11张图片
  保存后回到 CMake gui再次配置,上述错误跳过。但不出意外,再次报错,信息如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第12张图片
  字面意思就是找不到 JSONCPP,跟之前找不到 OpenCV 是一样的错误,这是第三个需要修改的地方。

1.2.3 添加 JSONCPP_DIR

   和添加 “OpenCV_DIR”的方法一样,打开之前下载安装的 jsoncpp 的根目录,在 “\lib\cmake\jsoncpp” 目录下有 jsoncpp 提供的 jsoncppConfig.cmake,只不过这里需要再多一个修改。

   首先打开 jsoncppConfig.cmake 文件,在最下面添加一句

set(JSONCPP_FOUND True)

  然后,打开 Matterport3D Simulator 根目录下的 CMakeLists.txt 文件,在find_package(JSONCPP REQUIRED jsoncpp)上面添加一句

set(JSONCPP_DIR D:/1-Compiler/dependency/jsoncpp-master/lib/cmake/jsoncpp)

  后面跟的是你自己对应的绝对路径,注意要使用 ‘/’ 而不是 ‘\’,如下所示
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第13张图片
  保存后回到 CMake gui再次配置,上述错误跳过。但不出意外,再次报错,信息如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第14张图片
  字面意思就是找不到 GLEW,这是需要修改的第四个地方。

1.2.4 添加 glew 路径

  打开我们之前安装的 GLEW 根目录,仔细寻找一哈发现并没有相应的 config.cmake 之类的文件,所以不能像解决 OpenCV 和 JSONCPP 那样来解决 glew 的问题。阅读一下 CMakeLists.txt,发先报错的地方就是下面几句话
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第15张图片
  大意是先使用 find_package 找到 glew 的所在位置,然后把 glew 的库路径 GLEW_LIBRARIES 设置为 GL_LIBS 变量。那既然 find_package 找不到,我就直接将 GLEW_LIBRARIES 设置为 glew 库目录的绝对路径,如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第16张图片
  直接将 find_package(GLEW REQUIRED) 注释,然后在下方添加一句

set(GLEW_LIBRARIES D:/1-Compiler/dependency/glew-2.2.0/lib/Release/x64)

  保存后回到 CMake gui再次配置,上述错误跳过,这次就没有再报其他错误了,成功生成了编译文件。
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第17张图片

1.2.5 指定 Python 解释器

  在完成上述修改之后, 配置不会再报错,但此时还不能生成工程,还需要对 CMake gui 上面的相关选项进行配置。再这里需要将 PYTHON_EXECUTABLE选项设置为你想使用的 Python 解释器,这里我将其暂时设置为 Miniconda 中自带的解释器,如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第18张图片

1.2.6 指定 CMAKE_BUILD_TYPE

  同时,将CMAKE_BUILD_TYPE设置为 Release。

  完成这些之后再次配置,然后选择生成并打开编译工程。

1.3 编译过程

  打开上述生成的编译工程,如下所示
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第19张图片  仍然要确保配置为了 Release + x64,然后开始对工程进行编译。

1.3.1 编译 MatterSim 工程

  首先来编译 MatterSim 工程,右键编译,不出意外,报了很多错误,
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第20张图片
  依次来看一下,错误分别如下

  1. fatal error C1083: Cannot open include file: ‘GL/glew.h’: No such file or directory
  2. fatal error C1083: Cannot open include file: ‘json/json.h’: No such file or directory
  3. error C2131: expression did not evaluate to a constant

1.3.1.1 fatal error C1083: Cannot open include file:

  fatal error C1083 类错误就是指找不到头文件,这个很好解决,只需要在 Matterport3D Simulator 根目录下的 CMakeLists.txt 中包含对应的头文件目录即可。

  打开 CMakeLists.txt 在设定 glew 相关的地方添加

include_directories(D:/1-Compiler/dependency/glew-2.2.0/include)

  在设定 jsoncpp 相关的地方添加

include_directories(D:/1-Compiler/dependency/jsoncpp-master/include)

  添加结果如下所示
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第21张图片

1.3.1.2 error C2131: expression did not evaluate to a constant

  双击定位到报错的地方,如下所示
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第22张图片
  仔细阅读,发现原来是 Visual Studio 编译器不支持动态创建数组这种写法,但是源码实在 Linux 下进行编译的,c++11 的 g++ 是支持这种写法的。

  所以只需要依次双击跳转至错误行, 将这些写法更换为动态内存分配的写法就可以了,

float gaussian_range[filter_size];

更换为

float* gaussian_range = new float[filter_size];
uint8_t im[NN];

更换为

uint8_t* im = new uint8_t[NN];
int pyr_heights[num_scales];
int pyr_widths[num_scales];
int pyr_offsets[num_scales];

更换为

int* pyr_heights = new int[num_scales];
int* pyr_widths = new int[num_scales];
int* pyr_offsets = new int[num_scales];

  修改完上述地方,再次在 CMake gui 中重新配置与生成,打开新的编译工程后再次编译 MatterSim 工程,仍然有两个小错误
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第23张图片

  • fatal error C1083: Cannot open include file: ‘glm/glm.hpp’: No such file or directory

  这个问题只需要再将 glm 的相关目录添加到 Matterport3D Simulator 根目录下的 CMakeLists.txt 中即可,如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第24张图片

  • fatal error C1083: Cannot open include file: ‘jsoncpp/json/json.h’: No such file or directory

  这个 json 的头文件已经添加过了,这里跟之前的包含写法不一样,统一一哈,双击定位,直接改为

#include 

  然后再次重新生成工程并进行编译,再次报错,报错如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第25张图片

1.3.1.3 error C2065: ‘M_PI’: undeclared identifier

  这个错误说,MatterSim.hpp 和 MatterSim.hpp 中的 M_PI 没有定义,所以我直接在这两个文件的开始添加

#define M_PI 3.1415926

  如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第26张图片
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第27张图片
  然后再次进行编译,这次得到了 link error,如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第28张图片

1.3.1.4 error LNK2019: unresolved external symbol

  仔细一看,发现是 jsoncpp 相关的库找不到,只需要在 Matterport3D Simulator 中添加 jsoncpp 的库文件目录即可,在 CMakeLists.txt 的 jsoncpp 相关位置添加

set(JSONCPP_LIBRARIES D:/1-Compiler/dependency/jsoncpp-master/lib/jsoncpp.lib)

  添加结果如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第29张图片
  然后再次重新生成并编译,最终编译成功,结果如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第30张图片

1.3.2 编译 mattersim_main 工程

  然后右键编译 mattersim_main 工程,如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第31张图片
  不出意外,得到一个小小的错误
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第32张图片
  说链接不到 Release\MatterSim.lib,可是 CMakeLists.txt 中指定确实是动态库,我们刚才编译生成的也确实是 dll 文件
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第33张图片
  为了解决这个问题,那就直接再编译一个静态库就好了,我试过直接在 Visual Studio 中修改生成的类型,但不work,所以直接打开 Matterport3D Simulator 根目录下的 CMakeLists.txt,
  将

add_library(MatterSim STATIC src/lib/MatterSim.cpp src/lib/NavGraph.cpp src/lib/Benchmark.cpp src/lib/cbf.cpp)

  改为

add_library(MatterSim SHARED src/lib/MatterSim.cpp src/lib/NavGraph.cpp src/lib/Benchmark.cpp src/lib/cbf.cpp)

  然后重新配置、生成,然后只编译 MatterSim 工程,成功得到 MatterSim.lib,如下
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第34张图片
  得到 MatterSim.lib 之后,我们再回到动态库的编译中,将

add_library(MatterSim SHARED src/lib/MatterSim.cpp src/lib/NavGraph.cpp src/lib/Benchmark.cpp src/lib/cbf.cpp)

  改为

add_library(MatterSim STATIC src/lib/MatterSim.cpp src/lib/NavGraph.cpp src/lib/Benchmark.cpp src/lib/cbf.cpp)

  然后再次重新生成并单独编译 mattersim_main,直接成功。
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第35张图片

1.3.3 编译 test 工程

  再编译 test 工程,直接成功。
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第36张图片

1.3.4 编译 MatterSimPython 工程

  然后再右键编译 MatterSimPython,得到一个小错误
Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第37张图片

  • LINK : fatal error LNK1149: output filename matches input filename ‘D:\1-Compiler\dependency\Matterport3DSimulator-master\build\Release\MatterSim.lib’
      大意说是重名了,我们将刚才生成的 MatterSim.lib 名字改为 MatterSim0.lib,然后再将 MatterSimPython 工程配置中 Linker 的输入中的 MatterSim.lib 也改为 MatterSim0.lib,
    Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第38张图片
      保存后重新编译,直接成功
    Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第39张图片
      也终于得到了 MatterSim.cp39-win_amd64.pyd
    Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)_第40张图片

1.4 总结

  至此完成了 Matterport3D Simulator 源码的编译,接下来将记录如何用 Python 调用 Matterport3D Simulator 的 API。

你可能感兴趣的:(Vision,and,Language,Navigation,计算机视觉,自然语言处理,c++,visual,studio)