In function ‘void bundleAdjustmentG2O(const VecVector3d&, const VecVector2d&, const cv::Mat&, Sophus::SE3d&)’: /home/jerry/slambook2/ch7/pose_estimation_3d2d.cpp:319:10: error: ‘make_unique’ is not a member of ‘g2o’ 319 | g2o::make_unique<BlockSolverType>(g2o::make_unique<LinearSolverType>()));
时间: 2024-04-22 21:27:56 浏览: 285
在您的代码中,出现了一个错误,指示 g2o 中没有名为 'make_unique' 的成员。这是因为在较新的 g2o 版本中,'make_unique' 函数已经被移除。相反,您可以使用标准库中的 'std::make_unique' 函数来创建独立指针。
要解决此问题,请将 'g2o::make_unique' 更改为 'std::make_unique',并确保您的代码正确包含了 `<memory>` 头文件。
修改后的代码应如下所示:
```cpp
std::unique_ptr<BlockSolverType> solver_ptr = std::make_unique<BlockSolverType>(
std::make_unique<LinearSolverType>());
```
这样应该能够解决您遇到的问题。如果还有其他问题,请随时提问。
相关问题
解释c++语法Sophus::SE3f System::TrackStereo(const cv::Mat &imLeft, const cv::Mat &imRight, const double ×tamp, const vector<IMU::Point>& vImuMeas, string filename) {
这也是一个函数声明,其中:
- `Sophus` 是一个 C++ 库,提供了用于 Lie 群和 Lie 代数的数据结构和运算;
- `SE3f` 是 Sophus 库中的一个类,表示三维欧几里得空间中的特殊欧几里得群 SE(3);
- `System` 是命名空间(namespace);
- `TrackStereo` 是函数名;
- 括号中的参数列表包含了函数所接受的输入参数,具体如下:
- `imLeft` 是一个 `cv::Mat` 类型的图像,表示左侧相机捕获的图像;
- `imRight` 是一个 `cv::Mat` 类型的图像,表示右侧相机捕获的图像;
- `timestamp` 是一个 `double` 类型的变量,表示时间戳;
- `vImuMeas` 是一个包含 `IMU::Point` 类型的向量(vector),表示 IMU 传感器测量得到的加速度和角速度信息;
- `filename` 是一个 `string` 类型的变量,表示文件名。
- `const` 修饰符表示这些输入参数是常量,即函数内部不会对它们进行修改;
- `<cv::Mat &>` 表示引用传递(reference),即将 `imLeft` 和 `imRight` 传递给函数时,不会进行拷贝,而是直接使用原始的图像数据,从而避免了额外的内存开销;
- `×tamp` 表示指针传递(pointer),即将 `timestamp` 的内存地址传递给函数,从而在函数内部可以直接修改 `timestamp` 变量的值;
- 函数返回值为一个 `SE3f` 类型的对象,表示相机的位姿(Pose)。
因此,这个函数的作用是根据左右两个相机捕获的图像以及 IMU 传感器测量得到的加速度和角速度信息,计算相机在世界坐标系中的位姿,并返回一个 `SE3f` 类型的对象。但具体实现细节需要查看函数定义。
/usr/bin/ld: /home/dog/catkin_ws/devel/lib/libvikit_common.so: undefined reference to `Sophus::SE3::exp(Eigen::Matrix<double, 6, 1, 0, 6, 1> const&)' /usr/bin/ld: /home/dog/catkin_ws/devel/lib/libvikit_common.so: undefined reference to `Sophus::SE3::operator=(Sophus::SE3 const&)' /usr/bin/ld: /home/dog/catkin_ws/devel/lib/libvikit_common.so: undefined reference to `Sophus::SE3::SE3()' /usr/bin/ld: /home/dog/catkin_ws/devel/lib/libvikit_common.so: undefined reference to `Sophus::SE3::SE3(Sophus::SE3 const&)' /usr/bin/ld: /home/dog/catkin_ws/devel/lib/libvikit_common.so: undefined reference to `Sophus::SE3::operator*(Sophus::SE3 const&) const' /usr/bin/ld: /home/dog/catkin_ws/devel/lib/libvikit_common.so: undefined reference to `Sophus::SO3::matrix() const' /usr/bin/ld: /home/dog/catkin_ws/devel/lib/libvikit_common.so: undefined reference to `Sophus::SE3::SE3(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)' /usr/bin/ld: /home/dog/catkin_ws/devel/lib/libvikit_common.so: undefined reference to `Sophus::SE3::operator*(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&) const' collect2: error: ld returned 1 exit status make[2]: *** [rpg_vikit/vikit_common/CMakeFiles/test_vk_common_camera.dir/build.make:134: /home/dog/catkin_ws/devel/lib/vikit_common/test_vk_common_camera] Error 1 make[1]: *** [CMakeFiles/Makefile2:575: rpg_vikit/vikit_common/CMakeFiles/test_vk_common_camera.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs.... /usr/bin/ld: /home/dog/catkin_ws/devel/lib/libvikit_common.so: undefined reference to `Sophus::SE3::exp(Eigen::Matrix<double, 6, 1, 0, 6, 1> const&)' /usr/bin/ld: /home/dog/catkin_ws/devel/lib/libvikit_common.so: undefined reference to `Sophus::SE3::operator=(Sophus::SE3 const&)' /usr/bin/ld: /home/dog/catkin_ws/devel/lib/libvikit_common.so: undefined reference to `Sophus::SE3::SE3()' /usr/bin/ld: /home/dog/catkin_ws/devel/lib/libvikit_common.so: undefined reference to `Sophus::SE3::SE3(Sophus::SE3 const&)'
<think>嗯,用户遇到了编译错误,是关于Sophus库中SE3类的未定义引用问题。具体报错是“undefined reference to `Sophus::SE3::operator*...”。我需要帮他解决这个问题。首先,我应该回忆一下常见的导致未定义引用的原因,通常是链接器找不到相应的库文件或者头文件路径不正确。
根据用户提供的引用,特别是引用[1],里面提到需要在CMakeLists.txt中显式链接到libSophus.so。用户可能没有正确配置CMakeLists.txt文件,导致编译器找不到Sophus库。可能的问题点包括:没有调用find_package(Sophus REQUIRED)、没有正确设置包含目录,或者没有将目标链接到Sophus库。
另外,引用[3]提到需要检查include_directories是否包含Sophus的头文件路径。如果用户的项目没有正确包含Sophus的安装路径,那么头文件可能无法找到,导致编译错误。同时,引用[4]指出可能需要设置编译器标志来避免某些警告被视为错误,尤其是在较新版本的Sophus中可能存在的兼容性问题。
接下来,我需要逐步指导用户检查他们的CMake配置。第一步应该是确认find_package(Sophus REQUIRED)被正确调用,并且Sophus的路径被正确设置。然后检查include_directories是否包含Sophus的头文件目录,如${Sophus_INCLUDE_DIRS}。接着,确保target_link_libraries中链接了Sophus的库文件,可能需要使用${Sophus_LIBRARIES}。
此外,用户可能需要处理版本兼容性问题,比如Sophus的模板化版本和非模板化版本之间的差异。如果用户使用的是较新的模板化版本,可能需要包含不同的头文件路径,例如Sophus/sophus而不是Sophus。同时,确保编译器标志正确,如引用[4]提到的添加-Wno-deprecated-declarations来避免某些警告导致编译失败。
最后,建议用户清理构建目录并重新编译,有时候旧的构建文件可能导致问题。如果所有配置都正确,问题可能出在Sophus库的安装是否正确,或者项目结构中的路径是否正确引用。</think>### 编译错误解决方案:Sophus库中SE3类未定义引用
#### 问题分析
该错误属于**链接器错误**,表示编译器找到了函数声明(头文件),但找不到对应的实现(库文件)。常见原因包括:
1. 头文件路径未正确包含
2. 库文件未正确链接
3. Sophus版本不兼容(模板化版本 vs 非模板化版本)
4. 编译器参数缺失
---
#### 分步解决方法
**1. 确保CMakeLists配置正确**
```cmake
# 必须包含Sophus的查找
find_package(Sophus REQUIRED)
# 包含头文件目录(注意不同版本路径差异)
include_directories(
${Sophus_INCLUDE_DIRS}
# 如果是模板化版本可能需要添加:
# /usr/local/include/sophus
)
# 显式链接库文件
target_link_libraries(${PROJECT_NAME}
${Sophus_LIBRARIES}
# 某些系统需要直接指定:
# Sophus::Sophus
)
```
▸ **验证点**:检查`SophusConfig.cmake`文件是否存在于`/usr/local/lib/cmake/Sophus/`[^1]
**2. 版本兼容性处理**
```cmake
# 模板化版本需要特殊处理
set(Sophus_USE_BASIC_IMPLICIT_CONVERSIONS ON)
add_compile_options(-DUSE_SOPHUS_TEMPLATE)
```
▸ **注意**:模板化版本(github最新版)与非模板化版本(ROS自带版)API存在差异[^4]
**3. 编译器参数配置**
```cmake
# 避免deprecated警告导致编译失败
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
```
---
#### 典型错误配置对比
| 错误配置 | 正确配置 |
|---------|---------|
| `include_directories(/usr/include/Sophus)` | `include_directories(${Sophus_INCLUDE_DIRS})` |
| `target_link_libraries(my_target Sophus)` | `target_link_libraries(my_target ${Sophus_LIBRARIES})` |
| 缺少`find_package(Sophus)` | 必须显式调用find_package |
---
#### 补充验证步骤
1. 执行`catkin_make -DCMAKE_VERBOSE_MAKEFILE=ON`查看详细链接过程
2. 检查`libSophus.so`是否存在于`/usr/local/lib/`
3. 确认代码中正确包含头文件:
```cpp
#include <sophus/se3.hpp> // 模板化版本
// 或
#include <Sophus/SE3.h> // 非模板化版本
```
---
#### 引用说明
[^1]: 显式链接库文件是解决未定义引用的关键步骤
[^3]: 头文件包含路径必须与实际安装位置一致
: 编译器参数设置可避免兼容性警告导致的构建失败
---
阅读全文
相关推荐
















