slam14讲ch6实践及各种问题

首先是装库,首先说明一下我此时的Eigen库版本是3.4.0,网上说会与这个版本相关,我的ceres库不是用的作者的。

1:安装ceres:

安装依赖项:

sudo apt-get install liblapack-dev libsuiteaprse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev

安装ceres 2.1.0(下载其他版本也可以类似于这样操作)

下载地址:Tags · ceres-solver/ceres-solver · GitHub

下载完成后解压:

tar -xzvf ceres-solver-2.1.0.tar.gz

解压完成后进行编译安装:

cd ceres-solver-2.1.0
mkdir build
cd build
cmake ..
make -j4
sudo make install

我在安装编译ceres的过程中出现了一个问题,我电脑之前安装了anaconda,在ceres编译的时候链接到anaconda的库里面去了,后面还是把anaconda给卸了。可能会有其他的办法,不过目前暂时不知。如果有人看见这篇记录了知道的也可以告诉我一下,谢谢啦

卸载anaconda环境参考博客:http://t.csdnimg.cn/fak2T

2:安装g2o

安装依赖项:

sudo apt-get install qt5-qmake qt5-default libqglviewer-dev-qt5 libsuitesparse-dev libcxsparse3 libcholmod3 

安装g2o:

git clone https://github.com/RainerKuemmerle/g2o  
cd g2o
mkdir build
cd build
cmake ..
make -j4    
sudo make install

3:编译运行过程

3.1编译ceresCurveFitting

首先把CMakeLists.txt里面的C++11改成了C++17

在编译ceresCurveFitting的过程中出现了如下报错:

[ 66%] Linking CXX executable ceresCurveFitting
/usr/bin/ld: /usr/local/lib/libceres.a(thread_pool.cc.o): undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
/usr/bin/ld: /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/ceresCurveFitting.dir/build.make:117:ceresCurveFitting] 错误 1
make[1]: *** [CMakeFiles/Makefile2:113:CMakeFiles/ceresCurveFitting.dir/all] 错误 2
make: *** [Makefile:91:all] 错误 2

发现是pthread动态库没有找到,需要指定动态库才行的

在CMakeLists.txt添加一行:

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")

编译成功

3.2编译g2oCurveFitting

在编译的过程中出现了make_unique的报错,这里根据报错的内容,把g2oCurveFitting.cpp文件里面make_unique前面的g2o改为std

最后全部编译成功,输出结果与作者相同。

这就是我遇到的全部问题。

参考博客:http://t.csdnimg.cn/vxYgA

                  http://t.csdnimg.cn/lo2Pb

### 解决方案 当遇到`Linking CXX executable multiple definition of *******`这样的错误时,通常意味着存在多个定义冲突。具体来说,某个符号(函数或变量)被多次定义并尝试链接到同一个目标文件中[^1]。 #### 可能的原因分析 - **重复包含头文件**:如果相同的头文件在不同源文件之间未正确保护,则可能导致全局变量或者静态成员函数的多重声明。 - **库版本不一致**:不同的模块可能依赖于相同名称但实现有所差异的对象,这会引发重定义问题[^2]。 - **CMake缓存残留影响**:旧版构建过程中产生的中间产物未能清理干净,特别是像`CMakeCache.txt`这类配置文件的存在可能会干扰新一次的构建过程。 - **Git忽略规则不当设置**:`.gitignore`文件中的条目如果不恰当的话,也有可能导致某些必要的编译资源丢失或是不必要的文件参与到了编译流程当中,进而造成链接失败的情况发生[^3]。 #### 推荐处理方法 为了有效解决问题,建议按照如下方式排查: - 清理整个工程环境后再重新生成项目结构: ```bash rm -rf build/ mkdir build && cd build cmake .. ``` - 检查所有涉及公共接口的部分是否有宏定义防护机制(`#ifndef/#define/#endif`)以防止意外引入多余实例化副本。 - 审视第三方依赖项及其路径设定,确认它们彼此兼容并无冗余加载现象出现。 - 如果是在IDE环境下工作,比如VSCode针对ESP-IDF开发板进行调试时,还需留意官方文档给出的相关指导说明以及特定平台特有的注意事项[^4]。 通过上述措施应该可以较好地定位并修复该类链接阶段发生的多义性错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值