QT6.7.2 MSVC源码编译 静态库 动态库

news/2024/7/5 20:22:10/文章来源:https://www.cnblogs.com/Dir-A/p/18278796

QT6.7.2 MSVC源码编译 静态库 动态库

也可以参考官方的文档 https://doc.qt.io/qt-6/build-sources.html

环境搭建

为了操作更有可复制性,这里在虚拟机中采用全新安装的系统进行配置。

系统镜像为en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96_2.iso

安装 Visual Studio 2022

https://visualstudio.microsoft.com/downloads/

个人用就下个Professional版,公司用就自己掂量一下了。

下好后找到VisualStudioSetup.exe打开

打开后把Desktop development with C++勾上就行了

勾上后默认安装MSVC编译器,CMake支持等,反正就是配置正常的C++开发环境

安装好后其实基本环境就有了
在开始菜单找到 Visual Studio 2022 / x64 Native Tools Command Prompt for VS 2022 点击运行

这其实是一个bat脚本,用于初始化一些MSVC的编译环境,点击运行后会打开一个cmd窗口,在这个窗口打开的程序会继承一些环境变量,这对于使用MSVC进行编译很重要。比如在VSCode中使用MSVC编译就需要在这个CMD窗口里启动VSCode,才能获得MSVC需要的编译环境(实际上就是设置了一些环境变量)。当然这启动的是64位的环境,如果需要编译32位的,则运行 x86 Native Tools Command Prompt for VS 2022

在CMD窗口依次输入

where ninja
where cmake
where python

可以查看环境中是否存在ninjacmake,这两个是编译QT6所需要的。

cmake是meta构建工具,有点类似于C++里模板的概念,它本身不构建项目,而是生成构建后端的项目文件,这个后端也叫generator,比如后端是make,则cmake生成makefile,后端是vs,则生成sln项目,之后再使用make或vs去编译。qt官方要求使用的构建后端是ninja,所以等下cmake会生成ninja的项目文件,通过ninja来调用msvc编译器,从而编译qt源码。当然这个generator也是可以换了,不一定必须要ninja。

从图中可以看到,缺少python环境。

去python官方下载安装包 https://www.python.org/

有些地区由于网络问题,会很慢

记得把Add python.exe to PATH勾上,然后安装。

不勾的话,就会造成找不到python的情况

安装好python后,把刚刚的CMD窗口关了,重新从开始菜单打开。

不重新打开的话,环境变量不会刷新,依旧找不到python,当然你要有办法刷新环境变量也可以

重新检查一下 cmake,ninja,python

cmake --version
ninja --version
python --version

可以发现都显示出了对应的版本号,再去qt官方对一下版本要求,如果都符合就可以了。

下载源码

条件允许的话可以直接从官方下载,当然镜像也可以

https://download.qt.io/

https://mirrors.nju.edu.cn/qt/

official_releases/qt/6.7/6.7.2/single/ 找到qt-everywhere-src-6.7.2.zip下载即可

single的话就是下载所有的源码,当然也可以下载单独的一个模块,也就是从submodules文件夹下找,

但如果下载单独的模块就会有依赖问题,因为单独的模块可能依赖其它模块,所以还要处理依赖,

我们常用的widget,core其实都是在qtbase模块里,如果只是使用widget进行开发,单独编译这个就够了,

这个模块没有其它依赖,毕竟base嘛(,但一般我们还需要用到designer,designer是在qttools模块里,

这个模块有一些其它的依赖,单独是没办法编译的,所以为了省事,我们把全部源码都下了,到时候可以选择需要的模块进行编译。

存放源码

下载源码zip压缩包后,需要找个地方存放,最好是找固定的位置放,以后编译出来qt库也放在一起。

这样的目的是因为在编译debug版的时会产生pdb文件,pdb文件中描述了源码在什么位置,有了这个信息就可以源码调试qt的库,当然如果没有这个需求,那编译好后的文件就可以随便挪动,源码也可以删了。如果是编译不带调试符号的release版的话,也是一样,没有固定位置的需要。

我这里就放在到E盘的Library目录下,同时解压源码。

解压可能很慢,推荐装一个7zip来解压

E:.
└───Library├───src│   │   qt-everywhere-src-6.7.2.zip│   ││   └───qt-everywhere-src-6.7.2│		├───cmake│		├───qtbase│		....│└───tmp

Library文件夹下有两个目录,srctmpsrc用于存放源码,tmp充当编译的临时目录,编译完成后可以删除。

src目录里放了源码的zip文件,和一个源码解压后的文件夹

硬盘可用空间最好有60G以上

编译源码

在源码解压后的目录下有个configure.bat脚本,这个脚本会利用cmake生成ninja的项目文件,有了ninja的项目文件,我们就可以编译了。

但这个脚本默认把项目文件生成在当前目录下,如果直接在源码目录执行,那么生成的ninja项目文件会和源码混在一起,当然如果你编译完后就把源码删了那也许可以这样(没试过),所以我们需要一个tmp目录来存放生成的项目文件,编译完成安装库后就可以把这个ninja项目的临时文件删了。

回到x64 Native Tools Command Prompt for VS 2022的CMD窗口,切换目录到刚刚创建的tmp文件夹

cd /d E:\Library\tmp

现在就可以执行configure.bat脚本来生成ninja项目文件了,但configure.bat脚本并不在当前目录下,那怎么办呢?

可以使用../来表示上一级路径,这样就可以表示出configure.bat脚本的路径了,

如果直接输入configure.bat脚本的全路径应该也可以

下面就表示了configure.bat脚本的路径

"../src/qt-everywhere-src-6.7.2/configure.bat"

为什么要用引号括起来?当然这里其实可以不用,但如果路径中有空格就需要了

先不急着执行这个脚本,先看看帮助信息

"../src/qt-everywhere-src-6.7.2/configure.bat" --help

如果直接执行configure.bat就是用默认的配置生成构建项目文件,但我们可以加一些参数来改变生成的构建项目的参数,比如我们想要同时编译debug和release版,或只想编译某一个模块,或只想编译静态库,或只想用静态运行时等。之所以叫configure.bat当然是因为能config啊(

下面是我们需要用到的几个参数

-static              编译静态库
-static-runtime      使用静态运行时(MD)
-debug-and-release   同时编译release版和debug版
-release             Release模式编译
--prefix             编译后库的安装位置
-submodules          选择要编译的模块

这里选择编译了qtbase和qttools模块,正常widget开发够用,如果要安装别的模块可以用逗号隔开,要安装所有就把这个指令删了(-submodules qtbase,qttools),qbase主要包括widgets,gui,core这些,qttools主要是为了编译designer

编译动态库

下面我们通过组合参数来编译动态库,也就是把库编译成dll,主要用于在开发阶段使用,因为动态库链接速度快(只需要导入个函数就行了),所以为了开发阶段快速编译,一般都是采用动态库(当然如果是闭源软件,那为了不被qt发函,最好也用动态库)

"../src/qt-everywhere-src-6.7.2/configure.bat" -debug-and-release --prefix="../MSVC_2022/x64_Shared_MD" -submodules qtbase,qttools

-debug-and-release 同时编译debug和release版,如果不需要debug版,改成-release即可

--prefix="../MSVC_2022/x64_Shared_MD" 表示等下编译完成后安装的目录,也就是当前目录的上一级目录下的MSVC_2022/x64_Shared_MD文件夹,说是安装其实就是把库的头文件,动态库,cmake配置文件复制出来

-submodules qtbase,qttools 这里表示要编译两个模块,qbase一般都需要,qttools主要是因为designer在里面,如果你不需要designer就可以删了这个,写成这样 -submodules qtbase,当然如果你想编译全部源码,那直接把-submodules qtbase,qttools整个删了就好了,默认是编译全部的。

当然你也可以加一些别的指令,比如skip跳过某些组件的编译,具体可以看help

执行命令后会开始配置

其实看命令行也知道,configure.bat的作用就是依据参数,去设置cmake的编译参数,也可以自己手动配置cmake的编译参数达到一样的效果,但大可不必,毕竟它都帮你写好了。

执行完成后就可以看到tmp目录下有一堆文件了

如果config成功,最后会提示你如何编译、如何安装

这里的编译和安装命令可能会依据配置情况,会有所不同,所以一定要看提示。

这里提示使用cmake --build . --parallel进行编译,那么直接执行这个指令就好了,接下来就是耐心等待了,注意硬盘可用空间。

编译过程中有一些警告很正常,只要不是error就可以。

编译完成后执行 ninja install 来安装库

按照提示来执行,也有可能不是这个命令

安装好后查看Libaray文件夹下多出来了个MSVC_2022文件夹里面有个x64_Shared_MD文件夹

进入bin目录,可以发现pdb符号和后缀为ddebug动态库都有了

至此动态库编译完成

编译静态库

步骤差不多,先把tmp目录清空

记得清空tmp目录

确认一下,CMD当前目录是在tmp里,如果不是请cdtmp目录。

执行以下指令

"../src/qt-everywhere-src-6.7.2/configure.bat" -static -static-runtime -release --prefix="../MSVC_2022/x64_Static_Release_MT" -submodules qtbase,qttools

-static 表示编译静态库

-static-runtime 表示使用静态的VC运行时(就是把VC的运行时编译进exe,这样就不会出现在一些电脑上找不到运行时情况了)

-release Release模式编译

如果加了-static-runtime,编译我们自己项目的时候release要设置MT编译参数,否则可能会链接出错。debug则要设置MTd编译参数,当然一般没人debug都静态编译,因为静态编译比较慢。

也可以把-static-runtime删了,这样就不需要额外设置MD编译参数了,但这样只有qt的库是静态编译的,当然编译出来确实是一个exe单文件,但这个exe还是依赖vc的运行时dll的,如果电脑上没有安装vc的运行时,也是没办法运行的,所以为了一到底,干脆也把vc的运行时静态编译进去exe了。

执行指令后等待Config

仔细阅读提示,发现编译命令和之前一样,但安装命令变了

仔细看的话还有个警告,说QDoc不会编译,和clang有关,需要配置clang,这个的话我们这边不关心,有需要的话可以在官方进一步了解

直接执行编译命令即可

编译好后执行安装

安装后MSVC_2022下就多出来了一个文件夹x64_Static_Release_MT

至此静态库的编译也完成了

用MSVC2022编译的库,不要给MinGW用,也不要给GCC之类的用,而且也不要去换MSVC的版本,如果要换编译器或换版本,就全部都换掉,然后重新编译。

记得把tmp目录删了,这东西很大,编译好,安装后一般就没用了

src源码目录,看自己情况,如果你需要qt源码调试,就留着,因为符号文件pdb里的路径是指向这些源码文件的,如果不需要就删了。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CPU管理 多进程图像

CPU管理 && 多进程图像 要管理CPU,先要学会使用CPU CPU的工作方式在操作系统学习之初就已经提过:取值执行程序存放在内存中,每段指令对应一个地址 CPU发出取指命令,将想取地址通过地址总线传到PC 内存根据地址取出对应地址的指令 从总线传回,CPU解释执行总之,就是…

电子显微镜对生物的观察

某黄色小虫,大概 \(100μm \times 400μm\) 的样子。

ARM Cortex-A 与 STM32 F107

ARM Cortex-A 和 STM32 F107 是两种不同的微控制器架构,它们在性能、应用场景和硬件支持方面有很大的差异。以下是它们的详细比较和分析: 1. 基本特性比较ARM Cortex-A 系列ARM Cortex-A 是 ARM 架构中的高级应用处理器系列,专为复杂的计算任务和高级应用设计。它广泛用于智…

前端开发 | Node 版本管理器选择

一、Nvm nvm 是一款 Node.js 版本管理工具,允许用户通过命令行快速安装、切换和管理不同的 Node.js 版本。nvm 只适用于 macOS 和 Linux 用户的项目,如果是 Windows 用户,可以使用 nvm-windows 、nodist或 nvs 替换。 安装方式 macOS 下载方式: brew install nvm # or sh 命…

示波器基本使用方法

示波器 示波器的基本使用方法首先检查示波器包装中是否有下列物品:• 示波器。 • 电源线。 • N2841A 10:1 10 MΩ 无源探头,数量= 2连接电源和信号源:将示波器的电源插入电源插座,并确保电源适配器或电池充足。 将需要测量的信号源(例如电路板、信号发生器等)连接到示波…

ros - Adafruit ESP32 Feather与树莓派(Raspberry Pi)比较

Adafruit ESP32 Feather 和树莓派(Raspberry Pi)都是广泛使用的硬件平台,分别在嵌入式系统和单板计算机领域具有各自的优势。以下是它们的详细比较,以及它们对机器人操作系统(ROS)的支持程度的分析。 1. 基本特性比较Adafruit ESP32 Feather核心处理器: 双核 Xtensa LX6(…

【App Service】解决 .NET Profiler 报告打开后无数据加载的问题

问题描述 App Service上可以收.NET 应用的Profile Trace文件,并且可以自动分析报告。 Collect a Profiler Trace If your app is down or performing slow, you can collect a profiling trace to identify the root cause of the issue. Profiling is light weight and is de…

1. Docker快速起步

Docker先安装Docker,再讲课没有Docker的日子里在以前的开发时代,开发人员把自己开发好的war交付给运维人员,运维人员为了把war部署到服务器上且保证能运行,就必须由运维人员在服务器上搭建好运行环境! 可这样带来的问题是,如果开发环境与部署环境不一致(比如版本),则会…

6. Idea集成docker

第一步:配置Docker远程访问修改 /lib/systemd/system/docker.service# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sockExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock重启docker服务systemctl daemon…

MOS管的作用和原理

目录 目录什么是MOS管作用和应用工作原理其他类型什么是MOS管 MOS管(Metal-Oxide-Semiconductor Field-Effect Transistor,金属氧化物半导体场效应晶体管)是另一种重要的半导体器件,其作用和工作原理如下: 以下为MOS管的原理图:作用和应用放大作用: MOSFET可以用作信号放…

图论最短路径问题与matlab实现

上一次我们讨论了如何进行图论可视化,这一次我们通过matlab来找出图论中距离最小路径 目录一、迪杰斯特拉算法(Dijkstra)二、shortestpath函数用法1.基本语法2.参数设计3.应用实例(1)输入图论信息(2)输入参数进行求解(3)最短路径可视化三、distances函数————求出任意…

2024年全球最好的低代码开发平台有哪些

低码开发平台是一个应用程序,提供图形用户界面编程,从而以非常快的速度开发代码,减少了传统的编程工作。这些工具有助于快速开发代码,最大限度地减少手工编码的努力。这些平台不仅有助于编码,而且还能快速安装和部署。 由frevvo调研显示,提升交付率从40%-69%,并且能减少对于较…

工业除尘自动化中的Profibus转Modbus网关应用解析

Profibus协议转Modbus协议网关(XD-MDPB100)在工业除尘自动化中起关键作用,实现不同通信协议设备间的数据共享和通信,Profibus转Modbus网关(XD-MDPB100)可以用于连接使用不同通信协议的控制设备,如PLC、DCS等。一、背景 在工业生产过程中,除尘系统扮演着至关重要的角色,…

Vue 中的Ajax

Vue 中的Ajax 配置代理 发送ajax请求的方式: 1.xhr new XMLHttpRequest() xhr.open() 配置请求信息xhr.send() 发送请求虽是鼻祖,但很麻烦,一般对其进行二次封装2.jQuery$.get$.postjQuery的核心是 DOM操作,在vue等框架中不常使用3.axios与jQuery相比的优势是 promise风格支…

用于模糊测试的工具

用于模糊测试的工具 Wfuzz Wfuzz通过将占位符 FUZZ 替换为 wordlist 值来工作。为了更清楚地理解这一点,让我们考虑一个例子: $ wfuzz -w userIDs.txt https://example.com/view_photo?userId=FUZZ在上面的命令中,userIds.txt 是一个包含数字 ID 值的 worldlist 文件。在这…

springboot+vue项目如何集成企业微信

本文以springboot+vue技术开发的低代码平台为案例,介绍应用系统如何集成企业微信,包括同步企业微信组织用户、单点登录、消息发送等。本文以springboot+vue技术开发的低代码平台为案例,介绍应用系统如何集成企业微信,包括同步企业微信组织用户、单点登录、消息发送等。 在线…

win11添加开机自启动

方法1win + R 打开运行,输入 shell:startup会打开一个文件夹将想要启动的程序快捷方式放进文件夹在设置里面搜索“启动”,可以看到开机启动项,确认已经打开。以上,针对不用管理员权限启动的程序,有效。 方法2 下面看需要管理员权限的:按Win+R,输入regedit,打开注册表编…

使用 Amazon Bedrock Converse API 简化大语言模型交互

本文将介绍如何使用 Amazon Bedrock 最新推出的 Converse API,来简化与各种大型语言模型的交互。该 API 提供了一致的接口,可以无缝调用各种大型模型,从而消除了需要自己编写复杂辅助功能函数的重复性工作。文中示例将展示它相比于以前针对每个模型进行独立集成的方式,具有…

MyBatis中Where标签:揭秘高效SQL构建的秘密

哈喽,大家好,我是木头左!理解Where标签的基础概念 在MyBatis中,<where>标签是用于构建SQL查询语句中的一个非常重要的元素。它允许你在一个动态的SQL语句中添加WHERE子句,而不需要担心SQL语法错误或额外的逗号和AND/OR关键字。使用<where>标签可以让的SQL语句…