Fari

Qt

qt在线安装

可以在这个地址下找到安装包的下载地址:

https://download.qt.io/archive/online_installers/4.6/

一步一步安装即可

选择组件时可以加上勾选 qt 中的msvc编译器(还需要额外安装visual studio)或MinGW编译器

到下载这一步比较慢,可能显示需要好几天或几十个小时。

一个解决办法是使用镜像下载,最简单的使用方法为:

# 在上述下载好的安装包目录下执行
qt-unified-windows-x64-4.6.0-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject

程序无法正常启动(0xc0150002)

解决方法:

到这个地址:https://www.microsoft.com/zh-CN/download/details.aspx?id=26368

下载这个

然后双击安装即可

查看出错原因

打开计算机管理,依次打开 系统管理 - 事件查看器 - Windows 日志 - 应用程序,稍等一会就可以在右边的窗口看到级别为“错误”的日志了,如果没有或不确定是哪个,则可以重新运行程序,出错后刷新日志页面第一个就是。双击改日志条目即可看到出错原因。

记一次QT程序Debug的过程(WinDbg的使用)

环境

WinDbg preview,Debugger client version: 1.2210.3001.0,Debugger engine version: 10.0.25200.1003

下载路径:https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-download-tools

QtCreator 7.0.2,Qt 6.2.3,MSVC 2019 64位

现象

程序异常退出,没有提示原因

找原因

1. debug方式qt打包exe

步骤见:https://blog.woyou.cool/post/4225

2. 使用WinDbg打开exe

3. 设置debug环境

pdb文件干啥的?

如果用debug模式打的包会在exe同级目录下生成一个pdb文件,该文件保存了一些debug需要的符号信息,如果没有该文件的话报错提示就会很隐晦

为啥需要设置源文件?

为了报错后能定位到报错位置,你本身已经打包成exe了,不包含源码了

也可以使用命令设置它们

# 设置源码位置
.srcpath [your source code location]

4. 启动程序

5. 程序崩溃时就会有堆栈信息

6. 查看详细异常信息

输入命令

!analyze -v

然后就能看到如下信息

由上述信息就可知出现空指针的位置

问题

源码显示不对应

见下图,一开始我很奇怪为什么我源码都注释掉了它还是提示这个地方有问题,更奇怪的是它竟然还有注释掉的局部变量信息

这其实就是上面第3步中源码和pdb文件位置设置的不对导致的,或者你在开始debug后修改了源码(这里显示的源码是和文件中的修改实时同步)

debug release版本

在 pro 文件中加入以下两行代码

# 生成pdb文件
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO

没有 QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO 无法生成 pdb 文件

QT程序打包

打包过程举例

以下项目将生成一个名为 filter_detect_qt.exe 的包,用它来举例

1. 编译

2. 找到输出文件

3. 将该 exe 文件复制到另外一个空的目录

4. 该目录下打开 cmd 窗口,运行代码:

# 注:windeployqt 命令这里有个坑,见下文中的注意事项
windeployqt filter_detect_qt.exe

完成后会自动将一些库文件复制进来

5. 手动将一些依赖动态库复制进来

第4步会将qt相关的一些库自动复制进来,但代码中的一些依赖动态库还需自己手动复制。可以打开 filter_detect_qt.exe 提示你缺什么库就复制什么

以下为手动复制进来的库文件(注:因为是动态库文件,所以仅仅打开exe查看报错是不够的,有些库文件只有在特定情况下才会使用,所以最好是在项目开发过程中就维护好这些动态库文件)

再次打开 exe 文件发现可以正常运行了。

遇到的问题

windeployqt 找不到库文件

从报错可以看出这应该是环境变量的问题,它使用了 anaconda 下的某个 windeployqt 程序,可以使用 where 命令查看命令路径:

# 类似于 linux 下的 whereis 命令
where windeployqt

# 如果在 powershell 下 where 命令无输出的话,使用 where.exe
where.exe windeployqt

而我们真正要使用的是 Qt 下的 windeployqt 命令,可以使用 everything 找到

C++、Qt编译相关概念

问题描述

使用vs2022创建了一个静态库,欲在qt程序中使用,结果报 undefined reference to xxx 错误,这里的xxx就是静态库中定义的方法。可以保证:

  1. 已经正确配置依赖并添加头文件

  2. 在vs中创建一个示例程序并引入该lib发现可以正常使用

由于对c++生态不太熟,做此记录

问题原因

vs使用的是msvc编译器,而qtcreator中使用的却是mingw编译器。两者并不兼容。

解决方案

qtcreator切换到msvc编译器,并且需要在电脑上正确安装与该msvc编译器对应的visual studio IDE。

概念区分

VC 和 VS

VC相关的概念在下面有详细说明,需要注意的是:除了下面说的它是一个C++编译器之外,在不同的语境下它也有可能是其他东西,例如一个名为VC++的IDE或者C语言等

可以简单理解为:vs(即Visual Studio IDE)是一个ide,对应java中的eclipse等。vc(即MSVC)是vindows下c++的编译环境,对应java中jdk的javac。

用vs开发时可以选择不同的vc版本

参考:https://zhuanlan.zhihu.com/p/497033106

MSVC、MSVC++、VC、VC++、Visual C++、Microsoft Visual C++

它们都是同一个东西

GNU、MinGW、GCC、gcc、g++(都带一个g)

GNU 简单理解为一个开源软件集合,其中有很多开源软件,例如 GNU/Linux,GNU/GCC 等

实际上GNU是一个单独的操作系统,拥有自己的内核 Hurd 和一些列周边软件,但在生产环境中常常将其替换成更成熟的 linux内核。如此,这种替换了linux内核但同时拥有GNU周边软件的GNU系统就被称为 GNU/Linux,它和linux其实是两个不同的系统,只不过很多时候直接将其简称为linux。

上面说的那个开源软件集合,其实指的就是GNU系统下的一些周边软件。

GCC 全称 GNU Compiler Collection,顾名思义,它是GNU系统下编译器的集合,它下面有各种语言的编译器,例如java编译器、c/c++编译器(gcc和g++)、OC编译器等

gcc/g++ 全称 GNU C Compiler,就是上述GCC集合中的c/c++编译器。事实上,它们也并非真正的编译器,它们只是一个驱动,用于判断被编译文件类型或系统环境等,然后调用真正的c/c++编译器cc1或cc1plus。它们的区别是:g++不管遇到c或c++文件都当作c++文件,从而调用cc1plus编译器进行编译。而gcc则进行区分。再者g++在编译完成后会自动链接c++的标准库,gcc不会。

有些文章说g++会调用gcc或反过来都是错误的。

MinGW 全称 Minimalist GNU for Windows,它就是将GNU系统下的一些工具软件打包给windows用。其中就包含gcc。

详见:https://blog.csdn.net/lee_ham/article/details/81778581

MSVC 和 MinGW

可以简单认为两者都是c++的编译器(但上面说过MinGW是一个工具集,实际上编译器是gcc),区别在于:

MSVC是windows下独有的,全称:Microsoft Visual C++。它和VS是一一绑定的。可以简单认为,想用哪个版本的MSVC就需要下载安装对应版本的VS。