Photo-SLAM / ORB-SLAM3 编译报错解决:undefined reference to DUtils::Random

Photo-SLAM / ORB-SLAM3 编译报错解决:undefined reference to DUtils::Random

在配置 Photo-SLAMORB-SLAM3 环境时,编译阶段经常会遇到链接库的问题。本文记录了在链接阶段出现 undefined reference to DUtils::Random...DBoW2::FORB... 错误的解决方法。

1. 问题描述

在执行编译命令(make)时,终端抛出大量"未定义引用"(undefined reference)的错误,导致 libORB_SLAM3.so 链接失败,进而导致后续的可执行文件(如 tum_rgbd, tum_mono 等)无法生成。

报错日志

bash 复制代码
/usr/bin/ld: /home/xiaosz/A_myTest/Photo-SLAM/ORB-SLAM3/lib/libORB_SLAM3.so: undefined reference to `DUtils::Random::SeedRandOnce()'
/usr/bin/ld: /home/xiaosz/A_myTest/Photo-SLAM/ORB-SLAM3/lib/libORB_SLAM3.so: undefined reference to `DUtils::Random::RandomInt(int, int)'
/usr/bin/ld: /home/xiaosz/A_myTest/Photo-SLAM/ORB-SLAM3/lib/libORB_SLAM3.so: undefined reference to `DUtils::Random::SeedRandOnce(int)'
/usr/bin/ld: /home/xiaosz/A_myTest/Photo-SLAM/ORB-SLAM3/lib/libORB_SLAM3.so: undefined reference to `DBoW2::FORB::L'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/tum_rgbd.dir/build.make:190: /home/xiaosz/A_myTest/Photo-SLAM/bin/tum_rgbd] Error 1
make[1]: *** [CMakeFiles/Makefile2:393: CMakeFiles/tum_rgbd.dir/all] Error 2
...

2. 原因分析

这个错误表明链接器(Linker)在生成 libORB_SLAM3.so 或者最终的可执行文件时,无法找到第三方库 DBoW2 中定义的函数(如 DUtilsFORB 类下的方法)。

通常是因为 DBoW2 默认编译为动态库(SHARED),但在某些系统环境或 CMake 配置下,ORB_SLAM3 主程序未能正确链接到该动态库,或者存在符号可见性问题。

解决方案思路 :将 DBoW2 的编译方式由动态库改为静态库(STATIC),强制将其代码嵌入到 ORB_SLAM3 中,从而解决符号丢失问题。

3. 解决方案

我们需要修改两个 CMakeLists.txt 文件。

第一步:修改 DBoW2 的编译配置

打开文件:
ORB_SLAM3/Thirdparty/DBoW2/CMakeLists.txt

找到以下代码(通常在文件中间部分):

cmake 复制代码
# 原代码
add_library(DBoW2 SHARED ${SRCS_DBOW2} ${SRCS_DUTILS})

将其修改为 STATIC ,并添加 位置无关代码(PIC) 的属性设置。这是因为静态库如果被链接进动态库(libORB_SLAM3.so),必须开启 PIC。

cmake 复制代码
# 修改后
add_library(DBoW2 STATIC ${SRCS_DBOW2} ${SRCS_DUTILS})

# 新增下面这一行,非常重要!
set_property(TARGET DBoW2 PROPERTY POSITION_INDEPENDENT_CODE ON)

第二步:修改 ORB_SLAM3 的链接路径

打开文件:
ORB_SLAM3/CMakeLists.txt

由于我们把库类型改成了静态库,生成的文件名后缀会从 .so 变为 .a,因此需要更新链接路径。

找到约第 71 行左右的引用路径:

cmake 复制代码
# 原代码
${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.so

修改为指向 .a 文件:

cmake 复制代码
# 修改后
${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.a

第三步:重新编译

修改完成后,建议清理旧的编译文件并重新构建,以确保更改生效。

bash 复制代码
cd ORB_SLAM3
rm -rf build
mkdir build
cd build
cmake ..
make -j4

再次编译后,undefined reference 错误应该消失,程序可以正常生成可执行文件。

相关推荐
bosins3 小时前
WSL 迁移指南:如何将 Linux 环境完整复制到另一台电脑
linux·运维·服务器
企鹅的蚂蚁4 小时前
LubanCat RK3588 实时 Linux 开发(六):启用 gs_usb 驱动并完成 USB-CAN 收发
linux·rk3588·linux驱动·socketcan·gs_usb·usb-can
2601_962299885 小时前
Linux执行Python脚本方法
linux·python·脚本·解释器·shebang
snow@li5 小时前
服务器运维:Linux命令速查手册(全景梳理)
linux·服务器·网络
handler015 小时前
【Linux】线程与虚拟内存的底层世界
linux·运维·服务器·c++·线程·虚拟地址空间·共享内存
新时代牛马5 小时前
实时 Linux:PREEMPT_RT、延迟来源与观测
linux·运维·服务器
微露清风5 小时前
# Linux 进程全景:从 PCB 到 O(1) 调度队列
linux·服务器
H_oRIZoN_5 小时前
Linux入门DAY38(手写 HTTP 客户端抓取天气 + 简易 HTTP 服务器实现元器件 Web 系统)
linux·linux应用编程
fangjianj6 小时前
windows环境反弹shell
linux·windows·web安全
明月不会写代码6 小时前
Ubuntu 下 Kitty 终端配置记录
linux·ubuntu