ubuntu系统:22.04
高翔视觉slam十四讲(第二版)
笔者在学习ch5中joinMap的代码时,发现代码怎么都编译不通过,经过一些列尝试后顺利解决,现在分享一下体会。
1. CmakeLists的配置问题
2. fmt库的依赖问题
3. Sophus库的版本问题
首先是CmakeLists的问题,原书中给的文件里的代码是没法运行的,需要增加一些配置,其中尤其要注意的是,如果你的库版本比较高,CmakeLists中的c++11声明需要删除/注释掉,或者修改成c++14,高版本的sophus和pangolin需要c++14的支持,否则编译会失败。
#链接c++11
set(CMAKE_CXX_FLAGS "-std=c++14")
完整的CmakeLists代码如下:
project(rgbd)
cmake_minimum_required(VERSION 3.10)
find_package(Sophus REQUIRED)
add_executable(joinMap joinMap.cpp)
include_directories(${Sophus_INCLUDE_DIRS})
#链接OpenCV库
find_package(OpenCV REQUIRED)
#添加头文件
include_directories( ${OpenCV_INCLUDE_DIRS})
target_link_libraries(joinMap ${OpenCV_LIBS} ${Pangolin_LIBRARIES})
find_package(Pangolin REQUIRED)
target_link_libraries(joinMap ${OpenCV_LIBS} ${Pangolin_LIBRARIES})
# Eigen
include_directories("/usr/local/include/eigen3")
target_link_libraries(joinMap ${Sophus_LIBRARIES} fmt)
#链接c++11
set(CMAKE_CXX_FLAGS "-std=c++14")
另外还有fmt依赖库的问题
在第二版的书中Sophus库是带模板的Sophus库,而第一版是书用的是不带模板的Sophus库
安装带模板的Sophus库需要提前安装对fmt的依赖库,在此我安装的是fmt 8.1.1版本
1. 下载(fmt-8.1.1)
解压到库文件所在的地方,在解压后的文件夹里打开终端
2. 编译fmt
mkdir build
cd build
cmake ..
cmake --build .
sudo make install
然后安装Sophus库,这里要注意得安装sophus 1.0.0版本,更高版本会导致编译出现以下错误:
/usr/bin/ld: 找不到 -ltinyobjfmt: 没有那个文件或目录
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/joinMap.dir/build.make:132:joinMap] 错误 1
make[1]: *** [CMakeFiles/Makefile2:83:CMakeFiles/joinMap.dir/all] 错误 2
make: *** [Makefile:91:all] 错误2
1. 下载sophus(sophus-1.0.0)
解压到库文件所在的地方,在解压后的文件夹里打开终端
2. 编译Sophus
mkdir build
cd build
cmake ..
cmake --build .
sudo make install
至此应该顺利安装,如有其他小问题,可留言。