slam14讲ch6遇到的问题

报错内容:

按照高博的书中的操作,在g2o库中遇到了一些问题。在跑g2oCurveFitting.cpp报错如下:

vscode上查看出现错误的位置就是这个位置

 auto solver = new g2o::OptimizationAlgorithmGaussNewton(
    g2o::make_unique<BlockSolverType>(g2o::make_unique<LinearSolverType>()));

报错原因:

bug出现的问题是说g2o中没有成员make_unique。可能是因为g2o库版本的原因。

但是在c++中,std::make_unique函数用于创建std::unique_ptr对象,该对象管理动态分配的内存。

他们之前的区别:

在 g2o 中,g2o::make_unique 是一个自定义的函数,它类似于标准库中的 std::make_unique,但具有一些区别。主要的区别在于 g2o::make_unique 是为了与 g2o 库的特定需求而设计的,可能会有一些定制化的功能或者与 g2o 库的其他部分进行交互的特性。而 std::make_unique 则是 C++ 标准库中的通用函数,用于创建 std::unique_ptr,并且遵循标准库的规范。在使用 g2o 库的代码中,可能会选择使用 g2o::make_unique 来创建对象,以确保与 g2o 库的其他部分兼容,并且可能还会提供一些额外的功能或者优化。如果您的代码不依赖于 g2o 库的特定功能,那么使用 std::make_unique 可能会更为合适,因为它是标准库中的通用函数,可移植性更好。

解决方法:

将g2o改为std,如下:

 auto solver = new g2o::OptimizationAlgorithmGaussNewton(
std::make_unique<BlockSolverType>(std::make_unique<LinearSolverType>()));

但是又出现新的问题:

找了下资料c++版本不对,改为C++17的版本即可如下:

set(CMAKE_BUILD_TYPE Release)
#将c++14注释掉
#set(CMAKE_CXX_FLAGS "-std=c++14 -O3")
# 设置C++17标准
set(CMAKE_CXX_STANDARD 17)
 
# 设置C++编译选项,包括优化等级O3
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")

list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

就运行成功了,如下图:

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值