C++编译并运行后出现Process finished with exit code 139 (interrupted by signal 11:SIGSEGV),程序意外终止.

问题描述:

        代码运行意外终止,报错信息为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" )

或者进一步:      

cmake_minimum_required(VERSION 3.26)
project(SLAM)


set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS "-O0 -g")

最后代码成功运行:

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XU磊260

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值