链接MetavisionSDK库后触发浮点异常(core dumped)的问题排查
问题:链接MetavisionSDK::core后matplotlib-cpp触发libopenblas浮点异常
问题背景
原本基于matplotlib-cpp的基础绘图代码及CMake配置可正常编译运行,但在CMake中添加MetavisionSDK::core库链接后,程序运行时抛出**"Floating point exception (core dumped)"**错误,GDB定位异常来自numpy依赖的libopenblas64_p-r0-2f7c42d4.3.18.so库的gemm_thread_n函数。
初始可运行代码
#include "matplotlibcpp.h" namespace plt = matplotlibcpp; int main() { plt::plot({1,2,3,4}); plt::show(); }
初始CMakeLists.txt
project(basic) cmake_minimum_required(VERSION 3.5) set(CMAKE_CXX_STANDARD 11) find_package(PythonLibs 3.10 REQUIRED) include_directories( /usr/local/matplotlib-cpp ${PYTHON_INCLUDE_DIRS} ) add_executable(basic basic.cpp) target_link_libraries(basic ${PYTHON_LIBRARIES})
修改后触发错误的CMakeLists.txt
project(basic) cmake_minimum_required(VERSION 3.5) set(CMAKE_CXX_STANDARD 11) find_package(MetavisionSDK COMPONENTS core REQUIRED) find_package(PythonLibs 3.10 REQUIRED) include_directories( include ${PYTHON_INCLUDE_DIRS} ) add_executable(basic basic.cpp) target_link_libraries(basic ${PYTHON_LIBRARIES} MetavisionSDK::core)
GDB报错信息
Thread 1 "basic" received signal SIGFPE, Arithmetic exception. 0x00007fffd708bb9d in gemm_thread_n () from /home/user/.local/lib/python3.10/site-packages/numpy/core/../../numpy.libs/libopenblas64_p-r0-2f7c42d4.3.18.so
解决方法
1. 调整链接顺序
GCC的链接顺序会影响符号解析,将Python相关库移至MetavisionSDK之后,避免符号冲突:
target_link_libraries(basic MetavisionSDK::core ${PYTHON_LIBRARIES})
2. 禁用OpenBLAS多线程
MetavisionSDK可能已初始化线程库,与OpenBLAS的多线程机制冲突,可通过环境变量禁用:
运行程序时执行:
export OPENBLAS_NUM_THREADS=1 ./basic
或在代码初始化阶段设置:
#include <cstdlib> int main() { std::putenv((char*)"OPENBLAS_NUM_THREADS=1"); plt::plot({1,2,3,4}); plt::show(); }
3. 检查ABI兼容性
- 确认MetavisionSDK使用的C标准与项目一致(当前为C11),若SDK采用更高标准,同步调整项目的
CMAKE_CXX_STANDARD参数。 - 核对Python的32/64位版本与MetavisionSDK是否匹配,避免跨位库链接。
4. 更换BLAS实现
若动态库冲突无法解决,可尝试:
- 重新编译numpy,使用静态链接的OpenBLAS。
- 切换numpy依赖的BLAS实现为MKL:
pip install numpy --force-reinstall --no-cache-dir --global-option="--mkl"
内容的提问来源于stack exchange,提问作者Mr Squid
相关产品推荐
相关产品推荐

