视觉SLAM十四讲 报错ch13 问题汇总 /usr/bin/ld: /usr/local/lib/libfmt.a(format.cc.o)

本文详细解析了视觉SLAM十四讲中第13讲遇到的编译错误,涉及fmt库链接和-fPIC编译要求。首先介绍了未链接fmt库的问题及解决方案,然后针对动态链接库中出现的-fPIC错误给出了编译fmt库并重新编译的步骤。适合SLAM开发者解决相关技术难题。

视觉SLAM十四讲 报错ch13 /usr/bin/ld: /usr/local/lib/libfmt.a

本文总结高博视觉SLAM十四讲第13讲demo程序编译会出现的问题。注意不包括由于Eigen库、OpenCV库没安装好的问题。

1. 问题1:未链接fmt库

[ 93%] Linking CXX executable ../bin/run_kitti_stereo                                                    
../lib/libmyslam.so: undefined reference to `std::locale fmt::v8::detail::locale_ref::get<std::locale>() 
const'                                                                                                   
../lib/libmyslam.so: undefined reference to `fmt::v8::d
[ 78%] Linking CXX executable ../Examples/Monocular/mono_tum [ 80%] Linking CXX executable ../Examples/Monocular-Inertial/mono_inertial_euroc /usr/bin/ld: CMakeFiles/mono_tum_old.dir/Examples_old/Monocular/mono_tum.cc.o: in function `main': mono_tum.cc:(.text.startup+0x451): undefined reference to `cv::imread(std::string const&, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::basic_binary_iprimitive<boost::archive::binary_iarchive, char, std::char_traits<char> >::load(std::string&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `pangolin::Split(std::string const&, char)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save(std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::putText(cv::_InputOutputArray const&, std::string const&, cv::Point_<int>, int, double, cv::Scalar_<double>, int, int, bool)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::getTextSize(std::string const&, int, double, int, int*)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::FileStorage::FileStorage(std::string const&, int, std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::namedWindow(std::string const&, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::FileNode::string() const' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::FileStorage::operator[](std::string const&) const' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::error(int, std::string const&, char const*, char const*, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `DBoW2::FORB::toString(cv::Mat const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `pangolin::CreateWindowAndBind(std::string, int, int, pangolin::Params const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::write(cv::FileStorage&, std::string const&, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive, char, std::char_traits<char> >::save(std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `DBoW2::FORB::fromString(cv::Mat&, std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `pangolin::CreatePanel(std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::operator<<(cv::FileStorage&, std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::write(cv::FileStorage&, std::string const&, double)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::load(std::string&)' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/mono_tum_old.dir/build.make:132:../Examples_old/Monocular/mono_tum_old] 错误 1 make[1]: *** [CMakeFiles/Makefile2:201:CMakeFiles/mono_tum_old.dir/all] 错误 2 make[1]: *** 正在等待未完成的任务.... /usr/bin/ld: CMakeFiles/mono_tum.dir/Examples/Monocular/mono_tum.cc.o: in function `main': mono_tum.cc:(.text.startup+0x451): undefined reference to `cv::imread(std::string const&, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::basic_binary_iprimitive<boost::archive::binary_iarchive, char, std::char_traits<char> >::load(std::string&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `pangolin::Split(std::string const&, char)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save(std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::putText(cv::_InputOutputArray const&, std::string const&, cv::Point_<int>, int, double, cv::Scalar_<double>, int, int, bool)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::getTextSize(std::string const&, int, double, int, int*)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::FileStorage::FileStorage(std::string const&, int, std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::namedWindow(std::string const&, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::FileNode::string() const' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::FileStorage::operator[](std::string const&) const' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::error(int, std::string const&, char const*, char const*, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `DBoW2::FORB::toString(cv::Mat const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `pangolin::CreateWindowAndBind(std::string, int, int, pangolin::Params const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::write(cv::FileStorage&, std::string const&, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive, char, std::char_traits<char> >::save(std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `DBoW2::FORB::fromString(cv::Mat&, std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `pangolin::CreatePanel(std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::operator<<(cv::FileStorage&, std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::write(cv::FileStorage&, std::string const&, double)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::load(std::string&)' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/mono_tum.dir/build.make:132:../Examples/Monocular/mono_tum] 错误 1 make[1]: *** [CMakeFiles/Makefile2:174:CMakeFiles/mono_tum.dir/all] 错误 2 /usr/bin/ld: CMakeFiles/mono_inertial_euroc.dir/Examples/Monocular-Inertial/mono_inertial_euroc.cc.o: in function `main': mono_inertial_euroc.cc:(.text.startup+0xa8b): undefined reference to `cv::imread(std::string const&, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::basic_binary_iprimitive<boost::archive::binary_iarchive, char, std::char_traits<char> >::load(std::string&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `pangolin::Split(std::string const&, char)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save(std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::putText(cv::_InputOutputArray const&, std::string const&, cv::Point_<int>, int, double, cv::Scalar_<double>, int, int, bool)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::getTextSize(std::string const&, int, double, int, int*)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::FileStorage::FileStorage(std::string const&, int, std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::namedWindow(std::string const&, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::FileNode::string() const' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::FileStorage::operator[](std::string const&) const' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::error(int, std::string const&, char const*, char const*, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `DBoW2::FORB::toString(cv::Mat const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `pangolin::CreateWindowAndBind(std::string, int, int, pangolin::Params const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::write(cv::FileStorage&, std::string const&, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive, char, std::char_traits<char> >::save(std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `DBoW2::FORB::fromString(cv::Mat&, std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `pangolin::CreatePanel(std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::operator<<(cv::FileStorage&, std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::write(cv::FileStorage&, std::string const&, double)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::load(std::string&)' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/mono_inertial_euroc.dir/build.make:132:../Examples/Monocular-Inertial/mono_inertial_euroc] 错误 1 make[1]: *** [CMakeFiles/Makefile2:147:CMakeFiles/mono_inertial_euroc.dir/all] 错误 2 [ 81%] Linking CXX executable ../Examples_old/Monocular-Inertial/mono_inertial_tum_vi_old /usr/bin/ld: CMakeFiles/mono_inertial_tum_vi_old.dir/Examples_old/Monocular-Inertial/mono_inertial_tum_vi.cc.o: in function `main': mono_inertial_tum_vi.cc:(.text.startup+0x890): undefined reference to `cv::imread(std::string const&, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::basic_binary_iprimitive<boost::archive::binary_iarchive, char, std::char_traits<char> >::load(std::string&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `pangolin::Split(std::string const&, char)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save(std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::putText(cv::_InputOutputArray const&, std::string const&, cv::Point_<int>, int, double, cv::Scalar_<double>, int, int, bool)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::getTextSize(std::string const&, int, double, int, int*)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::FileStorage::FileStorage(std::string const&, int, std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::namedWindow(std::string const&, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::FileNode::string() const' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::FileStorage::operator[](std::string const&) const' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::error(int, std::string const&, char const*, char const*, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `DBoW2::FORB::toString(cv::Mat const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `pangolin::CreateWindowAndBind(std::string, int, int, pangolin::Params const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::write(cv::FileStorage&, std::string const&, int)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive, char, std::char_traits<char> >::save(std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `DBoW2::FORB::fromString(cv::Mat&, std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `pangolin::CreatePanel(std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::operator<<(cv::FileStorage&, std::string const&)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `cv::write(cv::FileStorage&, std::string const&, double)' /usr/bin/ld: ../lib/libORB_SLAM3.so: undefined reference to `boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::load(std::string&)' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/mono_inertial_tum_vi_old.dir/build.make:132:../Examples_old/Monocular-Inertial/mono_inertial_tum_vi_old] 错误 1 make[1]: *** [CMakeFiles/Makefile2:120:CMakeFiles/mono_inertial_tum_vi_old.dir/all] 错误 2 make: *** [Makefile:84:all] 错误 2
最新发布
06-14
<think>我们正在解决ORB_SLAM3编译时出现的链接错误,主要涉及对`cv::imread`、`boost::archive`和`pangolin`的未定义引用。根据提供的引用信息,我们可以逐步解决这些问题。###1.解决`cv::imread`未定义引用问题根据引用[1][2][3],这个问题通常是由于OpenCV链接问题或头文件缺失引起的。可以尝试以下方法:-**确保正确链接OpenCV库**:在CMakeLists.txt中检查OpenCV的链接设置,确保使用了`target_link_libraries`将OpenCV库链接到目标。```cmakefind_package(OpenCVREQUIRED)target_link_libraries(ORB_SLAM3${OpenCV_LIBS})```-**添加缺失的头文件**:在调用`cv::imread`的源文件中,尝试添加以下头文件(引用[3]):```cpp#include<opencv2/imgcodecs/legacy/constants_c.h>```或者将`cv::imread`的第二个参数改为常量`cv::IMREAD_UNCHANGED`(如果之前使用了`CV_LOAD_IMAGE_UNCHANGED`等旧版常量)。-**检查OpenCV版本**:如果使用的是OpenCV4,注意一些常量和头文件路径发生了变化。例如,`CV_LOAD_IMAGE_UNCHANGED`被`cv::IMREAD_UNCHANGED`取代。###2.解决`boost::archive`未定义引用问题这个问题通常是由于Boost序列化库链接问题引起的。-**确保链接Boost库**:在CMakeLists.txt中添加Boost序列化库的链接。```cmakefind_package(BoostREQUIREDCOMPONENTSserialization)target_link_libraries(ORB_SLAM3${Boost_LIBRARIES})```-**检查Boost版本**:确保安装的Boost版本与ORB_SLAM3要求的版本兼容。###3.解决`pangolin`未定义引用问题根据引用[1],这个问题可能是由于Pangolin库的链接问题或者与libtorch的冲突引起的。-**确保正确链接Pangolin**:在CMakeLists.txt中正确链接Pangolin库。```cmakefind_package(PangolinREQUIRED)target_link_libraries(ORB_SLAM3${Pangolin_LIBRARIES})```-**处理与libtorch的冲突**:如果同时使用了libtorch(PyTorchC++库),可能会与Pangolin等库发生符号冲突。引用[1]提到,可以通过调整库的链接顺序或重新安装兼容版本的库来解决。建议先编译安装Pangolin,然后再安装libtorch,并确保在链接时Pangolin在libtorch之前。###4.解决`std::map`分配器问题(引用[4])在ORB_SLAM2中有一个关于`std::map`分配器的典型问题,ORB_SLAM3可能也存在类似问题。修改方法如下:在`LoopClosing.h`(或类似文件)中,将`KeyFrameAndPose`的类型定义修改为:```cpptypedefstd::map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,Eigen::aligned_allocator<std::pair<KeyFrame*const,g2o::Sim3>>>KeyFrameAndPose;```注意:`constKeyFrame*`改为`KeyFrame*const`,因为map的key是常量指针,这里需要保持一致性。###综合步骤1.**更新CMakeLists.txt**:确保正确查和链接OpenCV、Boost、Pangolin等库。2.**检查头文件**:根据错误提示,添加必要的头文件或更新常量。3.**调整链接顺序**:如果存在库冲突,调整`target_link_libraries`中库的顺序,将出现未定义引用的库放在后面(链接顺序从依赖度高的库到依赖度低的库)。4.**重新编译**:清除构建目录并重新编译。如果问题仍然存在,请提供具体的错误信息,以便进一步分析。§§相关问题§§1.如何正确配置CMakeLists.txt来链接多个第三方库?2.如何处理不同版本OpenCV的兼容性问题?3.如何解决C++中模板类和分配器的链接错误?</think>### ORB_SLAM3 链接错误解决方案 针对您遇到的 ORB_SLAM3 编译时链接错误(`cv::imread`、`boost::archive`、`pangolin` 未定义引用),以下是系统性的解决方案: #### 1. **解决 `cv::imread` 未定义引用** **原因**:OpenCV 库链接不正确或版本兼容性问题 **解决方案**: ```cmake # 在 CMakeLists.txt 中添加 find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) target_link_libraries(ORB_SLAM3 ${OpenCV_LIBS}) # 在调用 imread 的源文件中添加头文件 #include <opencv2/imgcodecs/legacy/constants_c.h> // 解决 OpenCV4 常量兼容问题 ``` 修改调用代码: ```cpp cv::Mat image = cv::imread(filename, cv::IMREAD_UNCHANGED); // 替代旧版 CV_LOAD_IMAGE_UNCHANGED ``` > 关键点:确保使用 OpenCV4+ 的新常量命名[^3] #### 2. **解决 `boost::archive` 未定义引用** **原因**:Boost 序列化库未正确链接 **解决方案**: ```cmake # 在 CMakeLists.txt 中添加 find_package(Boost REQUIRED COMPONENTS serialization) include_directories(${Boost_INCLUDE_DIRS}) target_link_libraries(ORB_SLAM3 ${Boost_LIBRARIES}) ``` 检查编译器标志: ```bash # 确保使用 C++11 标准 set(CMAKE_CXX_STANDARD 11) ``` #### 3. **解决 `pangolin` 未定义引用** **原因**:Pangolin 库路径或符号冲突 **解决方案**: ```cmake # 确保 Pangolin 正确配置 find_package(Pangolin REQUIRED) include_directories(${Pangolin_INCLUDE_DIRS}) target_link_libraries(ORB_SLAM3 ${Pangolin_LIBRARIES}) # 处理 libtorch 冲突(若存在) set(torch_DIR "/path/to/libtorch/share/cmake/Torch") # 显式指定 libtorch 路径 ``` 符号冲突修复: ```cpp // 修改 ORB_SLAM3 中的 map 分配器(参考引用[4]) typedef std::map<KeyFrame*, g2o::Sim3, std::less<KeyFrame*>, Eigen::aligned_allocator<std::pair<KeyFrame* const, g2o::Sim3>>> KeyFrameAndPose; ``` #### 4. **综合编译步骤 ```bash mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release \ -DOPENCV_PREFIX=/your/opencv/path \ -DBOOST_ROOT=/your/boost/path \ -DPangolin_DIR=/your/pangolin/lib/cmake/Pangolin make -j4 ``` > **验证要点**: > 1. 检查所有第三方库版本: > - OpenCV ≥ 3.4 > - Pangolin ≥ v0.6 > - Boost ≥ 1.65 > 2. 使用 `ldd ORB_SLAM3` 验证二进制文件的库链接 > 3. 确保无多版本库冲突(尤其 libtorch 与 OpenCV) [^1]: 库冲突问题参考解决方案 [^2]: OpenCV 符号未定义引用修复方法 [^3]: OpenCV4 常量兼容性处理 [^4]: STL 容器分配器修正方案
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值