在 Windows 下编译 Matterport3D Simulator 稍微有些不方便,需要对 CMakeLists.txt 进行一些修改,如果有更好的方法欢迎大家评论。
还是直接在 Github 上搜索 Matterport3D Simulator 的 repo,下载源码。
pybind11 @ 86e2ad4
,跳转到 pybind11 的 repo 下载源码,如下--recursive
选项。git clone --recursive https://github.com/peteanderson80/Matterport3DSimulator.git
准备好源码后,打开 CMake gui,设置好源码路径和编译路径,如下
然后点击 Configure 进行配置,并在弹出的对黄框中选择 Visual Studio 和 x64
不出意外,报错了,看一下报错信息,
原因是找不到 OpenCV,需要我们设置 “OpenCV_DIR” 为包含 OpenCVConfig.cmake 的路径,这是需要修改的第一个地方。
打开之前下载安装的 OpenCV 的根目录,在 “build\x64\vc15\lib” 目录下有 OpenCV 提供的 OpenCVConfig.cmake
只需要将该目录的绝对路径设置到 CMakeLists.txt 中即可,打开 Matterport3D Simulator 根目录下的 CMakeLists.txt 文件,在 find_package(OpenCV REQUIRED)
上面添加一句
set(OpenCV_DIR D:/1-Compiler/dependency/opencv/build/x64/vc15/lib)
后面跟的是你自己对应的绝对路径,注意要使用 ‘/’ 而不是 ‘\’,如下所示
保存后回到 CMake gui再次配置,上述错误跳过。但不出意外,再次报错,信息如下
提示我们找不到 PkgConfig,解决办法一是安装 PkgConfig,但是我没找到在 Windows 下使用 PkgConfig 的好方法,所及直接将 PkgConfig 改为功能相似的 find_package 命令,这是第二个修改的地方。
首先将 find_package(PkgConfig REQUIRED)
直接注释,然后将
pkg_check_modules(JSONCPP REQUIRED jsoncpp)
改为
find_package(JSONCPP REQUIRED jsoncpp)
更改结果如下所示,如果有更好的解决方法欢迎评论告知。
保存后回到 CMake gui再次配置,上述错误跳过。但不出意外,再次报错,信息如下
字面意思就是找不到 JSONCPP,跟之前找不到 OpenCV 是一样的错误,这是第三个需要修改的地方。
和添加 “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)
后面跟的是你自己对应的绝对路径,注意要使用 ‘/’ 而不是 ‘\’,如下所示
保存后回到 CMake gui再次配置,上述错误跳过。但不出意外,再次报错,信息如下
字面意思就是找不到 GLEW,这是需要修改的第四个地方。
打开我们之前安装的 GLEW 根目录,仔细寻找一哈发现并没有相应的 config.cmake 之类的文件,所以不能像解决 OpenCV 和 JSONCPP 那样来解决 glew 的问题。阅读一下 CMakeLists.txt,发先报错的地方就是下面几句话
大意是先使用 find_package 找到 glew 的所在位置,然后把 glew 的库路径 GLEW_LIBRARIES
设置为 GL_LIBS
变量。那既然 find_package 找不到,我就直接将 GLEW_LIBRARIES
设置为 glew 库目录的绝对路径,如下
直接将 find_package(GLEW REQUIRED) 注释,然后在下方添加一句
set(GLEW_LIBRARIES D:/1-Compiler/dependency/glew-2.2.0/lib/Release/x64)
保存后回到 CMake gui再次配置,上述错误跳过,这次就没有再报其他错误了,成功生成了编译文件。
在完成上述修改之后, 配置不会再报错,但此时还不能生成工程,还需要对 CMake gui 上面的相关选项进行配置。再这里需要将 PYTHON_EXECUTABLE
选项设置为你想使用的 Python 解释器,这里我将其暂时设置为 Miniconda 中自带的解释器,如下
同时,将CMAKE_BUILD_TYPE
设置为 Release。
完成这些之后再次配置,然后选择生成并打开编译工程。
打开上述生成的编译工程,如下所示
仍然要确保配置为了 Release + x64,然后开始对工程进行编译。
首先来编译 MatterSim 工程,右键编译,不出意外,报了很多错误,
依次来看一下,错误分别如下
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)
双击定位到报错的地方,如下所示
仔细阅读,发现原来是 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 工程,仍然有两个小错误
这个问题只需要再将 glm 的相关目录添加到 Matterport3D Simulator 根目录下的 CMakeLists.txt 中即可,如下
这个 json 的头文件已经添加过了,这里跟之前的包含写法不一样,统一一哈,双击定位,直接改为
#include
这个错误说,MatterSim.hpp 和 MatterSim.hpp 中的 M_PI 没有定义,所以我直接在这两个文件的开始添加
#define M_PI 3.1415926
如下
然后再次进行编译,这次得到了 link error,如下
仔细一看,发现是 jsoncpp 相关的库找不到,只需要在 Matterport3D Simulator 中添加 jsoncpp 的库文件目录即可,在 CMakeLists.txt 的 jsoncpp 相关位置添加
set(JSONCPP_LIBRARIES D:/1-Compiler/dependency/jsoncpp-master/lib/jsoncpp.lib)
添加结果如下
然后再次重新生成并编译,最终编译成功,结果如下
然后右键编译 mattersim_main 工程,如下
不出意外,得到一个小小的错误
说链接不到 Release\MatterSim.lib,可是 CMakeLists.txt 中指定确实是动态库,我们刚才编译生成的也确实是 dll 文件
为了解决这个问题,那就直接再编译一个静态库就好了,我试过直接在 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,如下
得到 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,直接成功。
然后再右键编译 MatterSimPython,得到一个小错误
至此完成了 Matterport3D Simulator 源码的编译,接下来将记录如何用 Python 调用 Matterport3D Simulator 的 API。