g2o库的一些坑(undefined reference to, fatal error: cs.h)

本文分享了使用G2O库在SLAM中的实践遇到的两个主要问题:缺失的cs.h文件及链接错误。首先介绍了如何重新安装并配置csparse库,然后详细说明了在CMakeLists.txt中添加相关依赖以解决函数引用问题。

g2o库是一个图优化库,在slam中多有应用。

下面是踩过的一些坑,供小伙伴们参考

第一坑
/usr/local/include/g2o/solvers/csparse/csparse_extension.h:27:10: fatal error: cs.h: 没有那个文件或目录
27 | #include <cs.h>
| ^~~~~~
是这样解决的
首先再次安装了一次csparse库,已经安装过的会提示已安装

sudo apt-get install libsuitesparse-dev

然后找suitesparse在哪

locate suitesparse

结果会显示一些/usr/include/suitesparse/下的.h文件, 其中就有cs.h

把这个路径放到CMakeLists.txt中

include_directories("/usr/include/suitesparse/")

第二坑,undefined reference to `g2o XXX
很多g2o的函数找不到。
在CMakeLists.txt中添加如下即可。

target_link_libraries(XXX g2o_core g2o_types_slam3d g2o_solver_csparse g2o_stuff g2o_csparse_extension)
### 解决 `cs.h` 文件未找到的编译错误 当遇到 `fatal error: cs.h: No such file or directory` 的编译错误时,这通常意味着编译器无法定位到所需的头文件。以下是几种可能的原因及解决方案: #### 1. 安装缺失的 如果 `cs.h` 是某个特定的一部分,则需要安装相应的开发包。对于许多SLAM项目来说,`cs.h` 可能来自 SuiteSparse 或者其他线性代数。 例如,在Ubuntu系统中可以尝试以下命令来安装SuiteSparse及其依赖项: ```bash sudo apt-get update sudo apt-get install libsuitesparse-dev ``` #### 2. 设置正确的包含路径 即使已经安装了必要的,还需要确保编译器能够访问这些中的头文件。可以通过 `-I` 参数向gcc指定额外的查找目录。 假设 `cs.h` 存在于 `/opt/SuiteSparse/include` 下面,那么可以在编译命令后面加上 `-I/opt/SuiteSparse/include` 来告知编译器去哪里寻找这个头文件[^1]。 #### 3. 修改源码中的包含方式 有时开发者会将本地副本放在项目的子目录内,并通过相对路径引入。检查是否有类似的安排并相应调整代码里的 `#include` 语句即可解决问题。 比如原先是这样写的: ```cpp #include <cs.h> ``` 改为如下形式指向具体位置: ```cpp #include "../external/cs.h" ``` #### 4. 验证环境变量设置 某些情况下,全局C/C++预处理器宏定义或环境变量也会影响头文件的位置解析逻辑。确认像 CPATH 这样的环境变量已正确定义并且包含了所有必需的搜索路径。 #### 5. 使用pkg-config工具简化配置过程 为了更方便地管理第三方以及它们对应的标志选项,推荐利用 pkg-config 工具自动生成合适的参数传递给编译链接阶段使用。只要目标平台支持的话,这种方法往往是最优解之一。 ```bash cflags=$(pkg-config --cflags suitesparse) libs=$(pkg-config --libs suitesparse) gcc $cflags your_program.c -o output_executable $libs ``` 以上方法应该可以帮助克服因找不到 `cs.h` 而产生的编译障碍。不过具体情况还需根据实际使用的软件包和个人工作流做适当调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值