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

news2025/4/28 4:57:20

系列文章目录

提示:


文章目录

  • 系列文章目录
  • 前言
  • 环境
  • 一、问题
    • 准备工作——为了在Release环境下可以进行断点调试
    • 分析
  • 二、解决
    • 1、根据需求,对函数类型进行更改
    • 2、根据需求,在函数内添加“return [int]”
      • 延伸——“禁用警告”
        • 消除 变量 的“黄色感叹号/黄色警告”
        • 消除 文件 的“黄色感叹号/黄色警告”
  • 其他(本人还未试过,但在此希望能提供一些思路)
  • 总结


前言

为了完善“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、禁用警告,需要谨慎添加

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

现代修谱,如何看待支系单飞的现象?

族谱与支谱、房谱的区别 现代修谱&#xff0c;修的是什么谱&#xff0c;你知道吗&#xff1f;其实现代修谱的种类有很多种&#xff0c;有支谱、房谱、族谱、宗谱、统谱、通谱等等&#xff0c;而这些在生活中都被我们简称为家谱。 不过在现代修谱里&#xff0c;宗谱、统谱、通谱…

极智编程 | 谈谈 C++ 中容器 map 和 unordered_map 的区别

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多笔记分享 大家好&#xff0c;我是极智视界&#xff0c;本文来 谈谈 C 中 map 和 unordered_map 的区别。 map 和 unordered_map 都可以看做是一种 key-value 的映射关系&#xff0c;unordered_map 可以理解为 无序版的ma…

C语言 数组

C语言 数组一、一维数组1. 数组的创建方式程序清单1程序清单22. 计算数组的元素的个数3. 数组在内存中的存储方式二、二维数组1. 二维数组的创建方式2. 计算二维数组的行和列3. 二维数组在内存中的存储方式三、数组名的含义总结数组名的应用场景数组名作为函数参数一、一维数组…

22.11.16打卡 mysql学习笔记

马上要考试了, 越到考试越想玩, 烦躁烦躁烦躁, 没学多少, 争取明天把mysql基础篇学完 DCL介绍 2022年11月16日 14:54 DCL主要用来处理数据库有哪些用户可以访问, 每个用户具有什么样的权限 用户管理 2022年11月16日 15:20 所有用户的数据都存放在系统数据库mysql中的user表…

Python是什么?要如何学习?

Python 是荷兰人 Guido van Rossum &#xff08;吉多范罗苏姆&#xff0c;中国程序员称其为“龟叔”&#xff09;在 1990 年初开发的一种解释型编程语言。 Python 的诞生是极具戏曲性的&#xff0c;据 Guido 自述记载&#xff0c;Python 语言是在圣诞节期间为了打发无聊的时间而…

基于全景相机的视觉里程计算法研究

一、视觉里程计 视觉里程计技术首先建立相机的成像模型&#xff0c;接着通过标定算法计算相机参数&#xff0c;最后建立相邻图像的关联并估计相机运动轨迹。 1.1相机在空间中运动的描述 描述相机在三维空间中的运动状态&#xff0c;即求解相机在空间中不同时刻下的位姿关系。相…

假冒网站引发多重安全风险 | 官方严正声明:切勿在非官方渠道购买或下载 Navicat 软件

Navicat 严正声明 近期&#xff0c;有关于 Navicat 假冒网站的事件&#xff0c;不法分子通过仿制官方网站&#xff0c;诱导用户下载盗版软件。Navicat 官方已正式向国内监管部门举报&#xff0c;提请将该不法网站下架。目前&#xff0c;监管部门已介入调查中。 我司呼吁广大用…

这次,听人大教授讲讲分布式数据库的多级一致性|TDSQL 关键技术突破

近年来&#xff0c;凭借高可扩展、高可用等技术特性&#xff0c;分布式数据库正在成为金融行业数字化转型的重要支撑。分布式数据库如何在不同的金融级应用场景下&#xff0c;在确保数据一致性的前提下&#xff0c;同时保障系统的高性能和高可扩展性&#xff0c;是分布式数据库…

C语言之详解内存操作函数

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C/C】 目录前言memcpy模拟实现memmove模拟实现memcmpmemset前言 memcpy叫做内存拷贝&#xff0c;memmove叫做内存移动&#xff0c;memc…

【数据结构】模拟实现双向链表

你必须非常努力&#xff0c;才能显得毫不费劲 目录 1.模拟实现双向链表 1.1 DLinkedList的内部类 1.2 DLinkedList的成员属性 1.3 DLinkedList的成员方法 1.3.1 在链表开头插入一个新结点 1.3.2 在链表结尾插入一个新的结点 1.3.3 计算结点个数 1.3.4 在链表任意位置…

4.构造器,this,修饰符详解

构造器&#xff1a; 构造器也叫构造方法&#xff0c;无返回值。非构造方法必须要有返回类型 主要作用&#xff1a;完成对象的初始化&#xff0c;创造对象时&#xff0c;自动调用构造器初始化对象 即使没有显示地使用static关键字&#xff0c;构造器实际上也是静态方法 JAVA…

HTML---基础入门知识详解

1&#xff1a;标签的概念 在别人写的网页中我们会看到许多文字&#xff0c;图片排版整齐&#xff0c;让人看的赏心悦目&#xff0c;这就是用到了标签&#xff0c;或者说标签就是帮我们实现某种作用的工具&#xff0c;比如制作段落&#xff0c;换行&#xff0c;导入图片&#x…

Android App 导出APK安装包以及制作App图标讲解及实战(图文解释 简单易懂)

操作有问题请点赞关注收藏后评论区留言~~~ 一、导出APK安装包 之前在运行App的时候&#xff0c;都是先由数据线连接手机和电脑&#xff0c;再通过Android Studio的Run菜单把App安装到手机上&#xff0c;这种方式只能在自己手机上调试应用&#xff0c;如果想在别人手机上安装应…

Python画爱心——谁能拒绝用代码敲出会跳动的爱心呢~

还不快把这份浪漫拿走&#xff01;&#xff01;节日就快到来了&#xff0c;给Ta一个惊喜吧~ 今天给大家分享一个浪漫小技巧&#xff0c;利用Python中的 HTML 制作一个立体会动的心动小爱心 成千上百个爱心汇成一个大爱心&#xff0c;从里到外形成一个立体状&#xff0c;给人视…

FITC标记SPG,FITC-SPG,荧光素标记链球菌G蛋白

产品名称&#xff1a;FITC标记SPG&#xff0c;荧光素标记链球菌G蛋白 英文名称&#xff1a;FITC-SPG 纯度&#xff1a;98% 规格&#xff1a;1mg 5mg 10mg 产地&#xff1a;西安 说明&#xff1a;提供使用说明&#xff0c;核磁图谱&#xff0c;包装&#xff0c;价格&#xff0…

ipv6地址概述——带你了解ipv6与ipv4的不同

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.ipv4与ipv6 1.ipv4与ipv6概述 在开始Pv6的学习以前&#xf…

Tomcat的安装与Maven依赖Servlet的使用

Tomcat的安装与Maven依赖Servlet的使用&#x1f34e;一.Tomcat应用&#x1f352;1.1什么是Tomcat&#x1f352;1.2Tomcat下载安装&#x1f352;1.3 IDEA插件Smart Tomcat&#x1f34e;二.Maven依赖Servlet应用&#x1f352;2.1什么是Servlet&#x1f352;2.2创建Servlet简单实现…

《Java》图书管理系统

这是一个对于Java中知识点的类&#xff0c;抽象类&#xff0c;封装&#xff0c;继承&#xff0c;多态&#xff0c;接口等进行的一个简单的代码练习&#xff0c;对于实际的图书管理系统还需要一点的优化 目录 前言 效果展示 功能模块 书架 定义书的类 创建书架 用户 User用…

黑马点评--优惠卷秒杀

黑马点评–优惠卷秒杀 全局ID生成器&#xff1a; 是一种在分布式系统下用来生成全局唯一ID的工具&#xff0c;一般要满足下列特性&#xff1a; 为了增加ID的安全性&#xff0c;我们可以不直接使用Redis自增的数值&#xff0c;而是拼接一些其它信息&#xff1a; Redis自增ID策…

CentOS7安装MySQL8

文章目录一 前言二、Centos 7 安装 mysql8 步骤&#xff1a;1.下载MySQL官方的 Yum Repository2.安装方法一&#xff1a; 用wget 下载后安装方法二&#xff1a;下载 RMP 软件包将该软件包上传到 Linux 服务器&#xff0c;并安装。3.Navicate 远程连接配置一 前言 最近在自己的…