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构建环境下不能运行”解决方案之一,以及 禁用(黄色)警告 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 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 延伸 禁用警告 消除