码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Qt——(详细)“项目在Debug构建环境下能运行而在Release构建环境下不能运行”解决方案之一,以及 禁用(黄色)警告


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

    系列文章目录

    提示:


    文章目录

    • 系列文章目录
    • 前言
    • 环境
    • 一、问题
      • 准备工作——为了在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";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    从代码中可以看出,很简单的调用关系,但运行之后,问题自然出现: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
    
    • 1
    • 2
    • 3
    • 4

    请添加图片描述

    分析

    请添加图片描述
    通过断点调试,“运行完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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    因为在 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    参考文献:
    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    消除 文件 的“黄色感叹号/黄色警告”

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4

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

  • 相关阅读:
    Mybatis条件语句 status != ““,status = 0时不生效
    freeCAD不合并导入step文件
    EasyExcel格式化映射注解和样式注解详解
    Re:从零开始教你使用 Sublime Text
    warp和grid_sample的一些理解
    【数据结构】二叉树的顺序结构及实现,堆,向上调整算法,向下调整算法,数组建堆算法,堆排序
    闲人闲谈PS之三十四——项目成本费用控制阈值
    近来的一些小感悟
    智慧城市低空+AI视频智能监控:构建新时代安全防线
    SpringMVC整合Shiro与filterChainDefinitions过滤器配置
  • 原文地址:https://blog.csdn.net/qq_41042595/article/details/127881381
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号