ORB-SLAM2编译时CXXABI_1.3.11’未定义的引用错误

在尝试编译ORB-SLAM2时,遇到关于CXXABI_1.3.11未定义引用的错误,涉及libtbb.so.2库。错误出现在Anaconda3路径下的libtbb.so.2文件,通过从x86_64-linux-gnu复制相应文件并替换,最终成功编译。问题可能与系统或编译路径配置有关。

在学习orbslam2的过程中,输入./bash.sh命令进行编译的过程中出现了以下错误,百度上好像没有人遇见过这种错误:

/home/jqli/anaconda3/lib/libtbb.so.2:对‘__cxa_init_primary_exception@CXXABI_1.3.11’未定义的引用
/home/jqli/anaconda3/lib/libtbb.so.2:对‘std::__exception_ptr::exception_ptr::exception_ptr(void*)@CXXABI_1.3.11’未定义的引用
collect2: error: ld returned 1 exit status
CMakeFiles/mono_tum.dir/build.make:133: recipe for target '../Examples/Monocular/mono_tum' failed
make[2]: *** [../Examples/Monocular/mono_tum] Error 1
CMakeFiles/Makefile2:141: recipe for target 'CMakeFiles/mono_tum.dir/all' failed
make[1]: *** [CMakeFiles/mono_tum.dir/all] Error 2
/home/jqli/anaconda3/lib/libtbb.so.2:对‘__cxa_init_primary_exception@CXXABI_1.3.11’未定义的引用
/home/jqli/anaconda3/lib/libtbb.so.2:对‘std::__exception_ptr::exception_ptr::exception_ptr(void*)@CXXABI_1.3.11’未定义的引用
collect2: error: ld returned 1 exit status
CMakeFiles/mono_kitti.dir/build.make:133: recipe for target '../Examples/Monocular/mono_kitti' failed

<think>嗯,用户遇到了ORB-SLAM2中的&#39;EGL_BAD_ACCESS&#39;错误,需要找出原因和解决方案。首先,我得回忆一下ORB-SLAM2的相关知识,可能涉及到图形库的使用,比如OpenGL或者EGL。EGL_BAD_ACCESS通常和图形上下文或资源访问有关。可能的原因有几个: 1. **多线程环境下的EGL上下文冲突**:ORB-SLAM2可能在多个线程中错误地共享EGL上下文,导致竞争条件或非法访问。比如,主线程和渲染线程同时操作同一个上下文,没有正确同步。 2. **OpenGL资源未正确初始化或释放**:如果在释放纹理、缓冲区等资源后仍然尝试访问,或者初始化时资源分配失败,可能引发这个错误。需要检查代码中资源管理的部分,是否有遗漏的释放操作或者重复释放的情况。 3. **GPU驱动兼容性问题**:旧版本的驱动可能存在bug,导致EGL接口调用出错。这时候需要升级驱动或者回退到稳定版本试试。 接下来,解决方案方面,针对上述可能的原因: - **确保EGL上下文线程隔离**:每个线程使用独立的EGL上下文,或者使用锁机制来同步访问。需要检查代码中EGL上下文的管理部分,比如是否在创建窗口或上下文时正确设置了线程绑定。 - **检查OpenGL资源生命周期**:使用工具如gDebugger或RenderDoc来追踪资源的使用情况,确保没有访问已释放的资源。特别是在SLAM系统中,地图点的创建和销毁可能频繁,容易出错。 - **更新GPU驱动或调整EGL配置**:查看系统日志,确认是否有驱动相关的错误信息。尝试升级到最新驱动,或者在运行程序时设置环境变量,比如`export MESA_GL_VERSION_OVERRIDE=3.3`来强制使用特定OpenGL版本。 此外,用户提供的引用中提到,编译ORB-SLAM2和Dynaslam时可能遇到其他问题,但这里的问题可能更特定于运行时错误。可能还需要检查是否在编译时启用了某些与EGL相关的选项,或者是否缺少必要的依赖库,比如EGL的开发包(libegl1-mesa-dev)是否正确安装。 还有,查看ORB-SLAM2的issue跟踪页面可能会有类似的问题讨论,比如GitHub上的问题区,其他开发者是否遇到过相同的错误并分享了解决方法。此外,确保所有第三方库(如Pangolin,OpenCV)的版本兼容性,特别是Pangolin用于显示,如果其配置不正确,可能导致EGL错误。 最后,如果以上方法都无效,尝试在调试模式下运行程序,使用gdb捕获错误发生时的堆栈跟踪,确定具体是哪一部分代码触发了EGL_BAD_ACCESS,从而更有针对性地解决。</think>### ORB-SLAM2中`EGL_BAD_ACCESS`错误的原因及解决方案 #### 错误原因分析 1. **EGL上下文冲突** ORB-SLAM2依赖图形库(如OpenGL/EGL)进行可视化,若在多线程环境中未正确隔离EGL上下文,可能导致资源竞争或非法访问。例如,渲染线程与主线程共享同一上下文时可能触发此错误[^1]。 2. **OpenGL资源管理问题** 资源(如纹理、缓冲区)未正确初始化或释放后仍被访问。例如: - 释放GPU缓冲区后未置空指针。 - 多线程环境下资源未同步释放。 3. **驱动或兼容性问题** 旧版GPU驱动可能对EGL接口支持不足,或OpenGL版本与代码要求不匹配。 --- #### 解决方案 1. **隔离EGL上下文或同步访问** - 确保每个线程使用独立EGL上下文(如为渲染线程单独创建上下文)。 - 添加互斥锁(Mutex)保护共享资源访问。 **代码示例**(伪代码): ```cpp std::mutex egl_mutex; void render_thread() { std::lock_guard<std::mutex> lock(egl_mutex); // EGL操作 } ``` 2. **检查OpenGL资源生命周期** - 使用工具(如`gDebugger`、`RenderDoc`)追踪资源泄漏或非法访问。 - 确保资源释放后不再被引用,例如: ```cpp glDeleteTextures(1, &texture_id); texture_id = 0; // 避免悬空指针 ``` 3. **更新驱动或调整EGL配置** - 升级GPU驱动至最新版本。 - 设置环境变量强制使用兼容模式(适用于Linux): ```bash export MESA_GL_VERSION_OVERRIDE=3.3 ``` 4. **验证第三方库配置** - 确保Pangolin(ORB-SLAM2的可视化库)编译时启用了正确的EGL支持。 **重新编译Pangolin示例**: ```bash cd Pangolin mkdir build && cd build cmake -DBUILD_EXAMPLES=ON .. make ``` --- #### 附加建议 -错误出现在动态物体剔除模块(如Dynaslam),检查与动态区域渲染相关的代码逻辑,避免重复释放遮挡掩膜资源[^2]。 - 调试时通过`gdb`捕获堆栈信息,定位触发`EGL_BAD_ACCESS`的具体代码位置: ```bash gdb --args ./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml (gdb) run ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值