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

2023-11-13

系列文章目录

提示:



前言

为了完善“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) {
		。。。。。。
	}
	return iCount;
	qDebug() << Q_FUNC_INFO << " END-- " << timeDebug.elapsed() << "ms";
}

参考文献:
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环境下系统会严格、严谨一些(调用函数的用法、被调用的库文件等等)。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod

随机推荐

  • LateX数学公式

    文章目录 一 希腊字母 1 小写希腊字母 2 大写希腊字母 3 全部希腊字母表 二 上下标 1 上下标是一个字符 2 上下标多于一个字符 3 不同的英文字母 1 i表示变量 2 i表示输入 3 补充 4 常量字母 三 分式与根式 1 分式
  • kaggle通过API下载数据集主要事项及指定路径保存

    每次下载新的数据集都需要重新操作接受规则 Rules gt 下载 json 文件 gt 将新的 json 文件放入到 kaggle 文件夹中 否则下载时 会出现错误 更改默认下载地址 kaggle config set n path v l
  • 双快门锁教程_双快功能的锁体的制作方法

    本发明属于一种双快功能的锁体 背景技术 我们知道 不管是机械式锁体 还是电子式锁体 往往都设有斜舌组件 方舌组件 天地销 联动板等 人们在门内 外操作执手或钥匙来斜舌组件 方舌组件推出去锁门或拉回来缩回到壳体内来开门的同时 通过联动板来将天
  • 计算机网络课好难啊,【知乎】计算机网络这门课为何如此之难

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 操作系统和计算机网络的共同点 在于它们都是相当复杂的体系结构 如果觉得难 也许是因为自己没能产生足够的求知欲 你也说了 无聊 晦涩 而无聊感其实是没治的 对课程的热情和对女生的爱慕感其实差不多
  • 字节秋招二面把我干懵了,问我SYN报文什么情况下会被丢弃?

    大家好 我是小林 之前有个读者在秋招面试的时候 被问了这么一个问题 SYN 报文什么情况下会被丢弃 好家伙 现在面试都问那么细节了吗 不过话说回来 这个问题跟工作上也是有关系的 因为我就在工作中碰到这么奇怪的问题 客户端向服务端发起了连接
  • MCU烧录方式有什么区别?

    1 MCU程序烧录方式 最近刚好接触到MCU烧录这一块的东西 综合以前学的一些零散的和目前掌握的相关资料 主要有以下几种相关的方式 ISP IAP以及ICP 它们都是对MCU进行编程 但具体的方式有所不同 下面详细了解下每个编程方式的特点
  • 二级C语言选择题练习附答案

    1 下列叙述中正确的是 A 所谓算法就是计算方法 B 程序可以作为算法的一种描述方法 C 算法设计只需考虑得到计算结果 D 算法设计可以忽略算法的运算时间 答案 B 解析 算法是指对解题方案的准确而完整的描述 算法不等于数学上的计算方法 也
  • 【Java】包package的概念和理解以及访问权限

    Java 包 package 为了更好地组织类 Java 提供了包机制 用于区别类名的命名空间 如何创建包 创建包的时候 你需要为这个包取一个合适的名字 之后 如果其他的一个源文件包含了这个包提供的类 接口 枚举或者注释类型的时候 都必须将
  • 字节实习接触到的数据库简单总结

    文章目录 一 Hive 二 ClickHouse 三 Abase 一 Hive Hive 由 Facebook 实现并开源 是基于 Hadoop 的一个数据仓库工具 可以将结构化的数据映射为一张数据库表 并提供 HQL Hive SQL 查
  • 计算机软考设计师中级真题

    计算机软考设计师中级真题分享 软考 以考代评 软考有着掌握知识 get技能的作用 职称评定 升职加薪 户籍加分 扎根落户的作用 软件设计师 适合做开发的朋友 通过本考试的合格人员能根据软件开发项目管理和软件工程的要求 按照系统总体设计规格说
  • 连续退火曲线的时空转换

    退火曲线的时空转换 应用场景是连续退火工艺过程 目的是将一个批次 即一块带钢 分解为若干个小带钢段 通过下述时空转换算法画出每个小带钢段的退火曲线 然后放在一起进行一些分析工作 例如profile方法 functional方法等等 参数设置
  • Go语言性能分析

    一 benchmark基准测试 1 性能分析 Go语言优化代码的过程中 需要评估代码的性能如何 Go标准库内置的testing测试框架提供了基准测试 benchmark 工具 可以很容易地对某一段代码进行性能测试 2 快速开始 1 初始化模
  • antd UpLoad 的 Dragger 加 ImgCrop 实现自定义上传及剪切

    前言本次封装的组件主要应用于自定义上传 上传过程中组件只用于展示图片 获取图片的obj转为base64return到组件外部在需要调接口时进行参数上传 1 使用 Dragger 需要 const Dragger Upload 2 组件部分
  • Python学习第十一天——re

    re 正则表达式 正则就是用一些具有特殊含义的符号组合到一起 称为正则表达式 来描述字符或者字符串的方法 或者说 正则就是用来描述一类事物的规则 在Python中 它内嵌在Python中 并通过 re 模块实现 正则表达式模式被编译成一系列
  • sql 列求和_SQL 中文笔记 aggregation

    SQL for Data Analysis课程笔记 来源于Udacity 是我上课所记 顺便分享出来便于不方便看视频课程的小伙伴参考 其次如果有错误的部分 还望大家指正 谢谢 Aggregate 聚集 Count 某特定列有多少行 Sum
  • uboot以tag方式给内核传参

    1 tag方式传参 1 struct tag tag是一个数据结构 在uboot和linux kernel中都有定义tag数据机构 而且定义是一样的 2 tag header和tag xxx tag header中有这个tag的size和类
  • 查找二叉树的从根节点到叶子节点的所有路径,递归,c/c++描述

    前面我们写过一篇 讨论如何用栈的方法找到从根节点到叶子节点的路径 其实用递归的方法也可以 但递归也要用到数组来保存已经访问过的路径节点 当根节点等于叶子节点时 表示已经找到了一条从根节点到叶子节点的完整路径 查找函数findAllPathA
  • win 7 安装 VMware 14的bug

    win 7 安装 VMware 14的bug 问题描述 安装 VMware 10 的bug 出现 Failed to create the requested registry keyKey Installer Error 1021 安装
  • 我的错误

    数据库连接错了 oracle用一个数据实例查询 web用一个数据实例查询 我也是醉了 两个小时浪费了 罪过 罪过
  • Qt——(详细)“项目在Debug构建环境下能运行而在Release构建环境下不能运行”解决方案之一,以及 禁用(黄色)警告

    系列文章目录 提示 文章目录 系列文章目录 前言 环境 一 问题 准备工作 为了在Release环境下可以进行断点调试 分析 二 解决 1 根据需求 对函数类型进行更改 2 根据需求 在函数内添加 return int 延伸 禁用警告 消除