cmake问题1
OpenCV库不要指定版本,我设备是4.2版本了,所以指定版本会出错,最最新的4.2版本就好了
# OpenCV
find_package(OpenCV 3.2 REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# OpenCV
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
编译问题1
- 编译错误打印
- 错误原因,Sophus版本比较新,库引用方式变了
- 修改方案
编译问题2
- 编译错误
- 错误原因是c++的标准不一致
- 解决办法,将ch13/CMakeLists.txt中的c++11标准改为c++ 14,如下所示:
编译错误3
- 错误打印
- 也是c++标准不一致引起的
- 解决办法,将ch13/CMakeLists.txt中的c++14标准改为c++17.
set(CMAKE_CXX_STANDARD 17)
编译问题4
- 错误打印
- 修改方法:g2o::make_unique 改成 std::make_unique
运行段错误1
- 错误打印,通过生成core加gdb看死机栈回溯
- 原因
这个问题最坑,查了好久,具体原因如下:
bool Config::SetParameterFile(const std::string &filename)
config_->file_ = cv::FileStorage(filename.c_str(), cv::FileStorage::READ);
本意是打开config\default.yaml文件并存到config_->file_中,但是 cv::FileStorage对象不支持拷贝构造函数,config_->file_ 并没有真正赋值;所以调用 Config::Get<std::string>("dataset_dir").c_str()
必然会段错误。
- 修改方案
将一个cv::FileStorage对象的实例"赋值"给另一个变量,应该使用移动构造函数或移动赋值运算符,所以改成:
bool Config::SetParameterFile(const std::string &filename)
// config_->file_ = cv::FileStorage(filename.c_str(), cv::FileStorage::READ);
cv::FileStorage fs = cv::FileStorage(filename.c_str(), cv::FileStorage::READ);
config_->file_ = std::move(fs);
这样修改依旧会出错,因为std::move(fs)只是移交权限,并不会做内存拷贝,因此当SetParameterFile
函数执行完,cv::FileStorage fs = cv::FileStorage(filename.c_str(), cv::FileStorage::READ);
的空间将被释放,config_->file_ 指向的空间被释放了;所以在其他函数中调用Config::Get<std::string>("dataset_dir").c_str()
必然会段错误,不想再花时间了,用了很low的方法,在cv::FileStorage fs = cv::FileStorage(filename.c_str(), cv::FileStorage::READ);
前加static定义成静态变量。
bool Config::SetParameterFile(const std::string &filename)
// config_->file_ = cv::FileStorage(filename.c_str(), cv::FileStorage::READ);
static cv::FileStorage fs = cv::FileStorage(filename.c_str(), cv::FileStorage::READ);
config_->file_ = std::move(fs);
运行段错误2
- 错误打印
- 解决办法