前言
主要总结最近slam mapping编译 等cmake使用上遇到的错误和解决方案
欢迎在评论区共同提出 我及时总结到这里面去 都是些坑
0. opencv 相关
cv2.error: /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/highgui/src/window.cpp:304: error: (-215)
主要是老胡的opencv版本问题… emm 需要走3.4,但是默认是3.2,所以会冲突
完整方案:https://chowdera.com/2022/134/202205140601479701.html
https://blog.csdn.net/qinqinxiansheng/article/details/120219388
最好的方案是:https://www.icode9.com/content-3-1356655.html
随后发现可以走ExternalProject_Add 会更好,TODO添加
1. gcc相关
很多关于这个点的教程 动不动就rm -rf 其实把 有时候挺危险的,包括本人自己以前 也比较喜欢 rm -rf,但是还是慎用,有set 的方式就用set哈
版本过低 no such file
主要是编译vdbfusion example时遇到的问题
fatal error: charconv: No such file or directory #include <charconv>
fatal error: filesystem: No such file or directory #include <filesystem>
然后搜到了一位韩国老哥的正解:https://jtrimind.github.io/troubleshooting/filesystem/ 升级gcc,如下
gcc --version # 检查版本
sudo apt install gcc-8 g++-8 # 安装8.0版本
# 设置系统默认值
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 700 --slave /usr/bin/g++ g++ /usr/bin/g++-7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 800 --slave /usr/bin/g++ g++ /usr/bin/g++-8
# 再次检查
gcc --version
然后配置CFLAGS为17即可解决,在CMakeLists.txt中加入:
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "--std=c++17 -lstdc++fs")
fatal error: execution: No such file or directory
同上理,但是有些可能会要求g+±9以上的 所以再次添加
sudo apt install -y gcc-9 g++-9 -y
# 设置系统默认值
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 900 --slave /usr/bin/g++ g++ /usr/bin/g++-9
# 再次检查
gcc --version
segmentation fault
主要是使用上一个 filesystem 出现 segmentation fault,主要是把编译能过 一运行就不行
定位到这个问题 就用了10分钟,主要是他不报错 就只是segmentation fault,和帅讨论后说是 :
库版本有冲突也会这个效果, 而且感觉一般都是库依赖的比较低层的系统库的问题
截图报错如下
最后找到了解决方案是
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_CXX_FLAGS "--std=c++17 -lstdc++fs")
这样是不够的 需要把flag写到link libraries 我真的涨见识了,所以我最后写成了这样
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_CXX_FLAGS "--std=c++17 -lstdc++fs")
add_library(datasets OBJECT)
target_sources(datasets PRIVATE KITTIOdometry.cpp)
target_compile_features(datasets PRIVATE cxx_std_17)
target_link_libraries(datasets PUBLIC Eigen3::Eigen "-lstdc++fs")
关于filesystem的一系列讨论:
- https://bugs.launchpad.net/ubuntu/+source/gcc-8/+bug/1824721/comments/6
- https://stackoverflow.com/questions/56615841/passing-stdfilesystempath-to-a-function-segfaults
- https://stackoverflow.com/questions/69122701/segmentation-fault-with-stdfilesystem-path-object
- 最后是这个链接里看到的:Why does this code results in an segmentation fault error? click
- https://stackoverflow.com/questions/39231363/fatal-error-filesystem-no-such-file-or-directory
赠人点赞 手有余香 😆;正向回馈 才能更好开放记录 hhh