报错内容:
按照高博的书中的操作,在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)
就运行成功了,如下图: