sophus使用报错‘fmt::v8::detail::error_handler::on_error(char const*)’

本文介绍了视觉算法开发中,如何从第一版的非模板类迁移到第二版模板类,重点讲解了在代码中如何正确包含Sophus库(如将`sophus/so3.cpp`改为`sophus/so3.hpp`),以及在CMakeLists.txt中进行的find_package和target_link_libraries调整。同时提到了关键类的替换(如Sophus::SO3d/f)。

视觉十四讲第一版采用非模板类,第二版采用模板类,两种使用方法不同,如果版本和代码语法不匹配则出现SO3、fmt等相关错误,以模板类为例:
#include <sophus/so3.cpp>
改为:#include <sophus/so3.hpp>
在cmakelist中更改:

find_package( FMT REQUIRED )
target_link_libraries( 可执行文件的名称 fmt::fmt)

Sophus::SO3dSophus::SO3f替换Sophus::SO3

使用 Sophus 库时,如果遇到链接错误 `undefined reference to 'Sophus::SO3::SO3(Sophus::SO3 const&)'`,通常与编译器无法正确找到 Sophus 的实现有关。该问题可能由以下几种原因引起: 1. **Sophus 版本兼容性问题** Sophus 早期版本(例如 v0.9.x)是基于模板的几何库,许多类和函数以头文件形式存在,而未提供预编译的二进制库。如果代码中使用了非模板的 SO3 构造函数,但实际链接的是一个不包含这些实现的库版本,则会出现此类链接错误。 2. **未正确链接 Sophus 库** 如果 CMakeLists.txt 中没有正确配置 Sophus 的查找和链接步骤,则编译器将无法识别所需的符号。建议确保 CMakeLists.txt 中包含以下内容: ```cmake find_package(Sophus REQUIRED) include_directories(${Sophus_INCLUDE_DIRS}) target_link_libraries(your_target_name ${Sophus_LIBRARIES}) ``` 3. **系统安装的 Sophus 与项目自带的 Thirdparty/Sophus 冲突** 在某些项目中(如 ORB_SLAM2/ORB_SLAM3),Thirdparty 文件夹中包含了特定版本的 Sophus。若系统中也安装了另一个版本的 Sophus,则可能发生命名空间或符号冲突。解决方法包括卸载系统 Sophus 或覆盖安装项目提供的 Sophus 版本: ```bash cd ./Thirdparty/Sophus/build/ sudo make install ``` 4. **构造函数签名变更** 某些 Sophus 版本中,拷贝构造函数 `Sophus::SO3::SO3(Sophus::SO3 const&)` 可能被显式删除或替换为移动构造语义,导致旧代码无法通过链接。此时应检查所用 Sophus 分支是否支持拷贝构造行为,并相应调整代码逻辑,避免直接拷贝对象。 5. **静态库 vs 共享库问题** 若 Sophus 被编译为共享库(libSophus.so),但在链接阶段未明确指定,也可能引发 undefined reference 错误。可以通过修改 CMakeLists.txt 中的 `target_link_libraries` 来强制链接到共享库版本。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值