Qt——(详细)“项目在Debug构建环境下能运行而在Release构建环境下不能运行”解决方案之一,以及 禁用(黄色)警告

17 篇文章 13 订阅

注意:若转载,请贴上链接“https://blog.csdn.net/qq_41042595/article/details/127881381”,如若发现抄袭或未标明来源现象,都可举报反馈!!!

系列文章目录

提示:



前言

为了完善“Tips”提示功能,我在 .h头文件里添加了一个函数/方法int updateCalOrMTips(); ,并在构造函数中调用的初始化函数里调用该函数,按我的习惯:先用Debug环境运行正常后,再用Release环境运行一遍,前者正常启动软件,后者却无法正常启动软件,自我摸索一小时左右,解决掉了该问题,在此记录下来,以供大家参考。

环境

开发环境
Windows10 操作系统
Qt 5.15.2 C++GUI框架
Desktop Qt 5.15.2 MinGW 64-bit 编译器
qmake 构建系统
Qt Creator 8.0.0 编辑器

一、问题

代码如下(示例):

mainwindow.h
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
private:
    // ---------初始化----------------- //
    void        initComboBoxItem();
    // ---------更新------------------ //
    int         updateCalOrMTips();
}

mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->initComboBoxItem();
}
void MainWindow::initComboBoxItem()
{
	。。。。。。
	this->updateCalOrMTips();
}
int MainWindow::updateCalOrMTips()
{
	qDebug() << Q_FUNC_INFO << " " << timeDebug.elapsed() << "ms";
	。。。。。。
	qDebug() << Q_FUNC_INFO << " END-- " << timeDebug.elapsed() << "ms";
}

从代码中可以看出,很简单的调用关系,但运行之后,问题自然出现:Debug下能运行,而Release下不能运行???

下面将进行断点调试,问题便迎刃而解!

准备工作——为了在Release环境下可以进行断点调试

先将“Release”、“Release/release”两个文件夹里生成的文件都删除,然后在 项目的Por文件任意地方添加如下代码,最后重新运行/构建后调试,在运行过程中添加断点,就能看到效果!

xxxxProject.pro
# release断点调试
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

请添加图片描述

分析

请添加图片描述
通过断点调试,“运行完int类型的updateCalOrMTips()代码,没有报任何语法问题,但弹出的警告表示系统出现故障”,可得出“缺少return [int]代码”会让Release下的系统无法正常运行!

参考文献:
QT 在release 模式下构建项目使用断点调试【在Pro文件中添加上方同样的代码,然后重新构建即可】
QT 设置release调试【MSVC2017编译器下Release实现断点调试,也是添加上方同样的代码放在Pro文件中】
Qt Creator release版本进行调试【MSVC2019编译器下实现Release的断点调试,详细做法:msvc-desktop.conf 文件进行配置一行代码——pro工程中添加三行代码——重新编译/构建】
如何使QT的Release模式可调试(Windows)【在VS2013软件中使用Qt,实现Release的断点调试,详细做法:msvc-desktop.conf 文件进行配置两行代码——pro工程中添加两行代码——重新编译/构建】
qt退出程序 debug正常 release程序崩溃【在本文章的“其他”小节中有提到】

二、解决

1、根据需求,对函数类型进行更改

修改的代码如下:

mainwindow.h
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
private:
    // ---------初始化----------------- //
    void        initComboBoxItem();
    // ---------更新------------------ //
    void        updateCalOrMTips();
}

因为在 mainwindow.cpp中只调用不需要返回值,所以在 mainwindow.h,将int改为void——表示无需返回值!

2、根据需求,在函数内添加“return [int]”

修改的代码如下:

mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->initComboBoxItem();
}
void MainWindow::initComboBoxItem()
{
	。。。。。。
	this->updateCalOrMTips();
}
int MainWindow::updateCalOrMTips()
{
	qDebug() << Q_FUNC_INFO << " " << timeDebug.elapsed() << "ms";
	。。。。。。
	int iCount = 0;
	if (iCount == 1) {
		。。。。。。
	}
	qDebug() << Q_FUNC_INFO << " END-- " << timeDebug.elapsed() << "ms";
	return iCount;
}

参考文献:
Qt debug版本运行正常release版本运行崩溃问题记录【该文章提供的是在Linux系统环境下Debug可运行Release却不可运行的几种解决办法,其中一种就是“2、根据需求,在函数内添加“return [int]””,其他两种,分别是“换另一种编译器——MSVC,重新运行/构建”、“提升GCC告警等级,添加-Werror 编译参数”】

延伸——“禁用警告”

针对一种解决方案“提升GCC告警等级,添加-Werror 编译参数”进行延伸:

GCC编译器-<嵌入式Linux应用程序开发标准教程>
【其中:-Wall 允许发出gcc提供的所有有用的报警信息、显示所有警告-Werror 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程、-Werror= 把某一警告当错误
如何提升gcc的编译告警等级【论坛中的讨论,解决方案就是“加-Wall -Werror”】
GCC编译设置错误和警告【如下图所示:】
在这里插入图片描述
——注意:“#pragma”是MSVC编译器(cmake构建系统)或VS软件才有的用法/表达式!如果使用MinGW编译器,请参考如下文章:
qt windows下#pragma comment(lib,“ws2_32.lib”) 报错【论坛中的讨论,在pro文件内 加入 LIBS += -lws2_32 代码,无论MSVC还是MinGW都可以使用】
#pragma comment (lib, “ws2_32.lib”) 调用报错【GCC环境下引用lib库】
Qt中不能使用#pragma comment(lib,…)这种方式导入lib【MinGW环境下引用lib库】
QtCreator4.8.0设置C++代码语法检查警告级别【Qt4的preferences配置“代码检查级别”;而下图是Qt5.15.2版本的“代码检查级别”配置】
请添加图片描述在这里插入图片描述
Qt Creator禁用警告【有两种禁用方式:禁用ClangCodeModel插件、禁用指定警告(这种与上图有关)】

ROS2中CMake编译选项的设置【C++、Cmake、GCC环境下的设置“-Werror、-Wall、Debug与Release编译类型”等等介绍(不是Qt的,但是语言、开发软件都是具有共通性的,依然可供参考)】
屏蔽编译过程中的警告信息cmake、QT【Cmake构建系统下屏蔽警告信息,在Pro文件里加一行代码

消除 变量 的“黄色感叹号/黄色警告”

在这里插入图片描述

Qt Q_UNUSED() 做什么用的
Qt Q_UNUSED() 方法的使用【该文章例子更多,更易看懂】
Qt Q_UNUSED使用【对未用过的局部变量,可以用Q_UNUSED()宏,消除黄色感叹号/黄色警告,如下代码:】

void closeEvent(QCloseEvent *e){ // Q_UNUSED()宏:用来在编译时忽略函数不用的形参、局部变量
    Q_UNUSED(e);
    emit Closed();
}
消除 文件 的“黄色感叹号/黄色警告”

在这里插入图片描述

Qt Creator 关闭.cpp文件右侧的黄色警告【Qt5.12版本下可操作,我的是Qt5.15版本,并无该选项】
Qt Creator 编辑区关闭右侧的警告和错误提示【方法与上一致】

其他(本人还未试过,但在此希望能提供一些思路)

Qt debug版本正常release版本无法运行【(Qt4)该文章表示:需要将Debug下用的Qt lib库赋值一份放在Release环境生成的文件夹里,运行后正常启动软件】
qt退出程序 debug正常 release程序崩溃【该文章表示:在Release环境下调试,发现“extern 声明的外部变量”需要谨慎使用】


总结

1、Debug环境下能运行的,Release环境下不一定运行,而Release环境下能运行的,一般Debug能运行,除非有“外部dll库指定Release环境下才可运行”的。

2、大方向上,个人认为:Debug环境下系统会自动优化或忽略这个问题,而Release环境下,语法上的要求,系统会严格、严谨一些(调用函数的规定用法、被调用的库文件等等)。

注意:一般先Debug环境下执行没问题,再去Release环境下执行,此为“双重保障”,并且,Debug构建套件在内存和数据处理方面,有时要比Release严格。
参考文献:
Debug模式和Release模式有什么区别你知道吗?

3、Release环境下也可以进行断点调试

xxxxProject.pro
# release断点调试
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

4、禁用警告,需要谨慎添加

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Yvette_QIU

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

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

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

打赏作者

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

抵扣说明:

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

余额充值