编译orb_slam3[windows]

本文档详细介绍了ORB_SLAM3的下载、编译过程,包括DBoW2、g2o库的配置,并针对编译过程中遇到的如unistd.h缺失、Boost autolink等问题提供了解决方案。此外,还给出了编译成功后的输出示例及可能遇到的错误及其解决方法,如编译器内部错误、找不到std::max定义等。

1 下载

git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3

建议编译前,先看一下该项目上的一个pull request:(使用原来项目问题过多, 遇到的每一个问题在第4节都会详细描述,于是使用如下的一个PR)
https://github.com/UZ-SLAMLab/ORB_SLAM3/pull/53
推荐使用vs2015生成器;

2 编译

2.1 DBoW2 编译(如果使用pr,本步骤可以不看,2.3的orbslam3也对所有cmakelist.txt的修改做了说明)

主要是需要添加oepncv和boost的依赖

PS F:\prjs\ORB_SLAM3> git diff
diff --git a/Thirdparty/DBoW2/CMakeLists.txt b/Thirdparty/DBoW2/CMakeLists.txt
index c561724..2368c23 100644
--- a/Thirdparty/DBoW2/CMakeLists.txt
+++ b/Thirdparty/DBoW2/CMakeLists.txt
@@ -32,9 +32,22 @@ if(NOT OpenCV_FOUND)
    endif()
 endif()

+
+set(Boost_USE_STATIC_LIBS ON)
+add_definitions("-DBOOST_ALL_NO_LIB=1")
+find_package(Boost REQUIRED COMPONENTS
+             serialization)
+
 set(LIBRARY_OUTPUT_PATH ${
   
   PROJECT_SOURCE_DIR}/lib)

-include_directories(${
   
   OpenCV_INCLUDE_DIRS})
+include_directories(${
   
   OpenCV_INCLUDE_DIRS} ${
   
   BOOST_INCLUDEDIR})
+link_directories(${
   
   Boost_LIBRARY_DIRS})
+
+message("lib is: " ${
   
   Boost_SERIALIZATION_LIBRARY})
+
 add_library(DBoW2 SHARED ${
   
   SRCS_DBOW2} ${
   
   SRCS_DUTILS})
-target_link_libraries(DBoW2 ${
   
   OpenCV_LIBS})
+target_link_libraries(DBoW2 
+    ${
   
   OpenCV_LIBS}    
+    ${
   
   Boost_SERIALIZATION_LIBRARY}
+)

diff --git a/Thirdparty/DBoW2/DBoW2/FORB.cpp b/Thirdparty/DBoW2/DBoW2/FORB.cpp
index 1f1990c..80bf473 100644
--- a/Thirdparty/DBoW2/DBoW2/FORB.cpp
+++ b/Thirdparty/DBoW2/DBoW2/FORB.cpp
@@ -13,7 +13,7 @@
 #include <vector>
 #include <string>
 #include <sstream>
-#include <stdint-gcc.h>
+#include <stdint.h>

 #include "FORB.h"

如果指定了vs2019,然后又用vs2015编译的库,就需要用如下的最后一个参数去掉boost的autolink;

mkdir build && cd build
cmake .. \
-G "Visual Studio 16" \
-DCMAKE_BUILDY_TYPE=Release \
-DOpenCV_DIR="F:/BASE_ENV/forOpenMVS/opencv/build" \
-DBOOST_ROOT="F:/BASE_ENV/forOpenMVS/boost_1_73_0_v140" \
-DBOOST_INCLUDEDIR="F:/BASE_ENV/forOpenMVS/boost_1_73_0_v140" \
-DBOOST_LIBRARYDIR="F:/BASE_ENV/forOpenMVS/boost_1_73_0_v140" \
-DBOOST_ALL_NO_LIB=1 \     # 避免boost的autolink,autolink会要求vs版本和boost版本一致

2.2 g2o

项目->属性->c+±>预处器宏定义->添加: WINDOWS,否则会出现vasprintf找不到定义。

cd ../../g2o

echo "Configuring and building Thirdparty/g2o ..."

mkdir build
cd build
cmake .. \
-G "Visual Studio 14" \
-DCMAKE_BUILDY_TYPE=Release \
-DEIGEN3_INCLUDE_DIR="F:\BASE_ENV\forOpenMVS\eigen" \
-DBOOST_ALL_NO_LIB=1 \

2.3 orbslam3

2.3.0 首先按照下面的diff修改所有的internal::axpy和internal::atxpy
+// add these marcos to fix:  
+// 1>f:\prjs\orb_slam3\thirdparty\g2o\g2o\core\sparse_block_matrix.hpp(277): fatal error C1001: 编译器中发生内部错误。
+
+#define _AXPY(MatrixType,A,x,xoff,y,yoff)y.segment<MatrixType::RowsAtCompileTime>(yoff) += (A) * (x).segment<MatrixType::ColsAtCompileTime>(xoff)
+#define _ATXPY(MatrixType,A,x,xoff,y,yoff)y.segment<MatrixType::ColsAtCompileTime>(yoff) += (A).transpose() * (x).segment<MatrixType::RowsAtCompileTime>(xoff)
+
+
 namespace g2o {
   
   
   using namespace Eigen;
 
@@ -249,7 +256,8 @@ namespace g2o {
   
   
         const typename SparseBlockMatrix<MatrixType>::SparseMatrixBlock* a=it->second;
         int destOffset = it->first ? _rowBlockIndices[it->first - 1] : 0;
         // destVec += *a * srcVec (according to the sub-vector parts)
-        internal::axpy(*a, srcVec, srcOffset, destVec, destOffset);
+        // internal::axpy(*a, srcVec, srcOffset, destVec, destOffset);
+        _AXPY(MatrixType, *a, srcVec, srcOffset, destVec, destOffset);
       }
     }
   }
@@ -274,9 +282,12 @@ namespace g2o {
   
   
         if (destOffset > srcOffset) // only upper triangle
           break;
         // destVec += *a * srcVec (according to the sub-vector parts)
-        internal::axpy(*a, srcVec, srcOffset, destVec, destOffset);
-        if (destOffset < srcOffset)
-          internal::atxpy(*a, srcVec, destOffset, destVec, srcOffset);
+        // internal::axpy(*a, srcVec, srcOffset, destVec, destOffset);
+        _AXPY(MatrixType, *a, srcVec, srcOffset, destVec, destOffset);
+        if (destOffset < srcOffset) {
   
   
+          // internal::atxpy(*a, srcVec, destOffset, destVec, srcOffset);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值