问题描述:
代码运行意外终止,报错信息为Process finished with exit code 139 (interrupted by signal 11:SIGSEGV)
CMakeList文件如下:
cmake_minimum_required(VERSION 3.26)
project(SLAM)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "-std=c++14 -march=native -O3")
set( CMAKE_BUILD_TYPE "Release" )
分析原因:
在排除代码无误后,进一步分析配置文件CMakeList.txt,发现原来参考配置文件的配置信息与自己电脑的配置不相符,
set(CMAKE_CXX_FLAGS "-std=c++14 -march=native -O3")
进一步分析,set(CMAKE_CXX_FLAGS "-march=native -O3")是指示编译器生成针对当前主机的最佳优化代码。它将启用所有特定于当前处理器的指令集扩展,例如 SIMD 指令等。这样可以让程序在该硬件上运行得更快。03表示这是一个优化级别标志,表示启用高级别的优化。
结合系统提示信息,SIGSEGV
是一种常见的运行时错误,通常意味着程序试图访问不合法的内存地址。可能有处理指针、数组或者在访问对象时没有正确初始化的情况导致的。
最终得出的结论是,set(CMAKE_CXX_FLAGS "-std=c++14 -march=native -O3")使用了 -march=native
和 -O3
,这会进行激进的优化,可能导致某些变量在调试时被优化掉,增加了出错的可能性。如果代码中存在未定义行为或者访问了已优化掉的变量,这可能会导致段错误(SIGSEGV
)。
解决办法:
不使用 -march=native
可以降低处理器特定优化可能引入的风险。更少的硬件特定优化使得代码更具可移植性,并减少了因编译器优化导致的错误。当然,如果你正在开发和调试程序,建议使用 -O0 -g
,以便于跟踪和识别问题。
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS "-O0 -g")
正确的配置文件设置:
cmake_minimum_required(VERSION 3.26)
project(SLAM)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set( CMAKE_BUILD_TYPE "Release" )
set( CMAKE_CXX_FLAGS "-std=c++17 -O3" )
最后代码成功运行:
标签:11,code,CMAKE,SIGSEGV,CXX,set,FLAGS,march,O3 From: https://blog.csdn.net/keshi12354/article/details/142788317