vs2017 编译Qt 5.11.2 源码

news2024/11/27 22:36:32

SDK 10.0.22000.194

有 2种编译方式 ,第二种 看下面

推荐使用方式二,简单方便,唯一不好是慢

方式一:

1、问题描述:

使用VS编译程序时,运行库选择多线程(/MT),表示采用多线程静态release的方式进行编译。

但是,发现编译是不能通过的。

qtmain.lib(qtmain_win.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MT_StaticRelease”

原因在于安装Qt时默认使用的是动态库,而且官方并没有提供编译好的静态库下载。 但我们可以自己下载Qt源码下来,自己重新编译,生成静态库,这样我们开发的Qt程序也就能完成静态的编译了。以后也就只需要编译成一个exe

2、下载源码包

首先,我们需要从Qt官网(地址:http://download.qt.io/archive/qt/5.11/5.11.2/single/ )下载对应的Qt源码。在这里,我以在Windows下编译Qt程序为例。

3、编译环境

以下是编译时需要的工具,在编译之前,请务必安装! 安装都比较简单。这里直接给出官网下载的链接。最后记得添加到环境变量(安装时把‘’添加到PATH环境“选项勾起就可以了,或者在安装后手动添加也可以)。

  • Ruby version 1.9.3 or later
  • Perl version 5.12 or later
  • Python version 2.7.5 or later
  • JOM

建议安装jom,来替换nmake进行编译,可以充分利用CPU多核的能力,否则估计你会中途吐血的。 jom是nmake的多线程版,nmake不支持多线程,单线程编译速度太慢了。

4、编译源码库

以上东西都准备好以后,接下来我们可以开始编译源码了。

在编译之前记得先将所有的杀毒软件关掉(避免误杀)。

然后进入解压后的Qt源码文件夹下的qtbase/mkspecs下,找到win32-msvc文件夹。

另外顺便说下,如果是想编译较早些时候的Qt源码,源码下载下来后会发现里面没有这个文件夹。而是这样的:

这时候只需要根据你安装的Qt版本进行选择就可以了。

进入选中的文件夹之后,找到qmake.conf文件并使用文本编辑器打开。

我们再根据它include的内容定位到相应的文件。

include(../common/msvc-desktop.conf)

找到相应的文件后,修改其内容。在这里也就是msvc-desktop.conf这个文件。

找到以下标志。将原来的:

QMAKE_CFLAGS_RELEASE    = $$QMAKE_CFLAGS_OPTIMIZE -MD
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MD
QMAKE_CFLAGS_DEBUG      = -Zi -MDd

修改成:

QMAKE_CFLAGS_RELEASE    = $$QMAKE_CFLAGS_OPTIMIZE -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MT
QMAKE_CFLAGS_DEBUG      = -Zi -MTd

即将MD改成MT,MDd改成MTd,动态改成静态

在开始菜单中,找到“适用于 VS 2017 的 x64 本机工具命令提示“ 或者 “x64 Native Tools Command Prompt for VS 2017”。

将当前目录切换到源码解压后的目录下。比如我的是在E盘下的qt-everywhere-src-5.11.2这个文件夹。

接下来,将执行关键的几个命令。首先执行configure命令。复制并执行以下命令:

configure.bat -mp -confirm-license -opensource -platform win32-msvc -debug-and-release -static -force-asserts -prefix E:\Qt5.11.2\Qt-msvc2017-x64-static -static-runtime -silent -opengl desktop -qt-sqlite -qt-pcre -qt-zlib -qt-freetype -qt-harfbuzz -qt-libpng -qt-libjpeg -nomake examples -nomake tests

命令解释含义

该命令是在Windows平台上用于编译和配置Qt源代码的批处理文件。让我们逐步解析命令的各个选项和参数:

configure.bat: 这是Qt源代码配置文件的名称。
-mp: 这个选项用于启用多处理器编译,以提高编译速度。
-confirm-license: 这个选项用于确认接受Qt的许可协议。
-opensource: 这个选项用于指定使用开源版本的Qt。
-platform win32-msvc: 这个选项用于指定目标平台为Windows,并使用Microsoft Visual C++编译器。
-debug-and-release: 这个选项用于同时构建调试和发布版本的Qt库。
-static: 这个选项用于生成静态链接库,以便其他应用程序可以将其静态链接到自己的代码中。
-force-asserts: 这个选项用于强制进行断言检查,可以在编译时捕获潜在的错误。
-prefix E:\Qt5.11.2\Qt-msvc2017-x64-static: 这个选项用于指定生成的Qt库文件的安装目录。
-static-runtime: 这个选项用于在静态链接库中包含运行时组件,以便其他应用程序可以独立运行而无需安装Visual C++运行时库。
-silent: 这个选项用于静默安装,即在安装过程中不显示任何图形界面。
-opengl desktop: 这个选项用于启用OpenGL支持,并针对桌面版进行优化。
-qt-sqlite: 这个选项用于启用SQLite数据库支持。
-qt-pcre: 这个选项用于启用Perl兼容的正则表达式库支持。
-qt-zlib: 这个选项用于启用zlib压缩库支持。
-qt-freetype: 这个选项用于启用FreeType字体渲染库支持。
-qt-harfbuzz: 这个选项用于启用HarfBuzz文本渲染库支持。
-qt-libpng: 这个选项用于启用libpng图像库支持。
-qt-libjpeg: 这个选项用于启用libjpeg图像库支持。
-nomake examples: 这个选项用于禁用构建示例应用程序。
-nomake tests: 这个选项用于禁用构建测试应用程序。

总结起来,该命令用于配置和编译Qt源代码,生成静态链接库和其他功能,并将其安装在指定的目录中。

· 其中 -platform win32-msvc 在前面也有提到过的,根据我们安装Qt的版本选择即可; · -static 表示编译静态库; · E:\Qt5.11.2\Qt-msvc2017-x64-static 是编译完后的安装目录,此目录不需要事先创建,建议路径不要太长。 这个过程不需要很久,执行完结果如图:

执行jom命令。(这时候可以先去喝杯咖啡或者做做其他事情~~ )

jom执行完毕之后,最后再输入jom install安装。 如果没有意外,那么我们就会在之前设定好的路径下看到编译好的文件。

至此,整个Qt源码编译过程也就结束了(过程说简单也简单,但我却搞了两三天,就因为前面环境没搭好) 但别高兴得太早,这还没结束呢。。我们必须得建立一个测试程序运行起来才算成功!

4、安装和配置

VS2017中Qt插件安装教程

点击菜单栏上的“Qt VS Tools > Qt Options”打开Qt选项窗口;

然后将我们编译好的Qt版本(E:\Qt5.11.2\Qt-msvc2017-x64-static)添加进来。

我们创建一个Qt应用程序进行测试。

整理遇到的问题。

使用Release方式编译,编译不通过! 错误一:

错误一:

Qt5Core.lib(qobject.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”(main.obj 中)

原因及解决方法:

  • 因为我们编译的Qt5.11.2的VC运行库是MT和MTd,工程向导创建的缺省是MD和MDd。也就是我们需要把运行库对应的值改了。

错误二:

LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

原因及解决方法:

  • 在同一个项目中,所有的源文件必须链接相同的VC运行时库。如果某一文件用了MTd版本,而其他文件用MT版本的库,也就是说用了不同的库,就会导致这个警告的出现。 添加一下命令行可解决:

/NODEFAULTLIB:“libcmt.lib”


错误三:

Qt5Core.lib(qglobal.obj) : error LNK2019: 无法解析的外部符号 gethostname,该符号在函数 “public: static class QString __cdecl QSysInfo::machineHostName(void)” (?machineHostName@QSysInfo@@SA?AVQString@@XZ) 中被引用 Qt5Core.lib(qglobal.obj) : error LNK2019: 无法解析的外部符号 WSAStartup,该符号在函数 “public: __cdecl QWindowsSockInit::QWindowsSockInit(void)” (??0QWindowsSockInit@@QEAA@XZ) 中被引用 Qt5Core.lib(qglobal.obj) : error LNK2019: 无法解析的外部符号 WSACleanup,该符号在函数 “public: __cdecl QWindowsSockInit::~QWindowsSockInit(void)” (??1QWindowsSockInit@@QEAA@XZ) 中被引用

原因及解决方法: 显然,这是因为有些依赖库我们没添加好~

附加库目录改成:Undefined control sequence \lib(QTDIR)\plugins\imageformats;

附加依赖项改成:qtmain.lib;qwindows.lib;Qt5Widgets.lib;Qt5Core.lib;Qt5Gui.lib;Qt5PlatformCompositorSupport.lib;Qt5EventDispatcherSupport.lib;Qt5FontDatabaseSupport.lib;Qt5ThemeSupport.lib;Qt5WindowsUIAutomationSupport.lib;qgif.lib;qicns.lib;qico.lib;qjpeg.lib;qsvg.lib;qtga.lib;qtiff.lib;qwbmp.lib;qwebp.lib;qtfreetype.lib;qtharfbuzz.lib;qtlibpng.lib;qtopenwnn.lib;qtpcre2.lib;qttcime.lib;winspool.lib;shlwapi.lib;rpcrt4.lib;comdlg32.lib;oleaut32.lib;imm32.lib;winmm.lib;glu32.lib;opengl32.lib;gdi32.lib;kernel32.lib;user32.lib;shell32.lib;uuid.lib;ole32.lib;advapi32.lib;ws2_32.lib;mpr.lib;%(AdditionalDependencies)

  • 在main.cpp文件中加入代码:
    #pragma comment(lib, "version.lib")
    #pragma comment(lib, "Netapi32.lib")
    #pragma comment(lib, "userenv.lib")
    #pragma comment(lib, "msvcrtd.lib")
    #pragma comment(lib, "Dwmapi.lib")

错误四:

qt.qpa.plugin: Could not find the Qt platform plugin “windows” in “” This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

原因及解决方法:

插件无法加载,加载plugin的办法: 使用宏 Q_IMPORT_PLUGIN,在main.cpp中增加代码如下:

	#include <QtCore/QtPlugin>
	Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)

继续执行,发现可以了~ 成功了!

方式二:

用VS2017编译Qt 5.15.x静态库

一些莫名其妙的原因要升级到Qt5,耗时几天,总结如下:

第1步:下载源码包:qtbase-everywhere-opensource-src-5.15.x.zip

第2步:安装下面程序:strawberry-perl-5.x.x; python-3.x.x; rubyinstaller-devkit-3.23.x.x

第3步:解压源码包到目录,如:\src-5.15\qtbase\,修改\mkspecs\common\msvc-desktop.conf:

QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_OPTIMIZE -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MT
QMAKE_CFLAGS_DEBUG = -Zi -MTd 

第4步:打开x86 Native Tools Command Prompt for VS2017,进入源码目录执行:

configure -prefix E:\Qt5.11.2\Qt-msvc2017-x64-static -static -release -opensource -confirm-license -nomake tests -nomake examples

第4步:执行nmake,开始编译 。。。

第5步:执行nmake install,开始安装。。。

说明:

1. 建议使用VS2017或之前版本编译,否则配置时Qt 5.15.x可能无法识别

2. Qt5开始,源码树被划分多个子模块,可以单独编译(完整的源码包约有900多Mb)

3. 安装perl,ruby后,确保环境变量被设置,命令行执行: 

perl -version 
ruby --version

4. 编译64位,运行x64 Native Tools Command Prompt,其它步聚相同

5. configure加上: -prefix 指定安装目录,默认是:C:\Qt\Qt-5.15.x,此目录不可更改,除非重新编译。Qt-VSAddin 打开工程时需要查找QT_INSTALL_PREFIX宏。

6. config_help.txt包含完成的配置选项,config.summary文件中包含配置后选项,修改配置后configure加上-recheck-all

7. 重新编译前先执行nmake clean

遇到的问题:

1. 编译dbus出错,configure加上: -no-dbus 不编译Qt D-Bus模块,还是报错:qdbusxml2cpp.cpp(83): error,找到include/qt5/QtCore/qconfig.h增加如下内容:

#if defined(QT_NO_DBUS) && defined(QT_DBUS)
# undef QT_NO_DBUS
#elif !defined(QT_NO_DBUS) && !defined(QT_DBUS)
# define QT_NO_DBUS
#endif

2. 报错:缺少flex,安装WinFlexBison,修改win_flex.exe文件名为flex.exe,设置环境:set path=%PATH%;d:\WinFlexBison

3. 报错:缺少llvm-cofig,安装LLVM(注意需对应Qt编译位数),发现没有llvm-config,下载llvm源码包单独编译tools其中的llvm-config,放到LLVM/bin

编译子模块qttools:

第1步:下载源码包:qttools-everywhere-src-5.15.x.zip

第2步:解压源码包到目录:如:\src-5.15\qttools

第3步:安装LLVM, 添加环境变量LLVM_INSTALL_DIR到安装目录:set LLVM_INSTALL_DIR=d:\LLVM

第4步:设置qmake到环境变量,进入qttools子目录执行:

qmake
nmake
nmake install

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

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

相关文章

安卓用户当心: CERT-IN 发布高危漏洞警告

已发现的漏洞一旦被利用&#xff0c;将构成严重风险&#xff0c;可能导致未经授权访问敏感信息。 印度计算机应急响应小组&#xff08;CERT-IN&#xff09;在最近发布的一份公告中&#xff0c;就影响印度安卓用户的新安卓漏洞发出了重要警告。 该警告对使用安卓 11、12、12L、…

modbus转profinet网关连接PLC与变频器控制摆辊应用在涂布机案例

通过兴达易控modbus转profinet网关的应用&#xff0c;PLC能够直接与变频器进行通讯&#xff0c;并实现对摆辊的精确控制。兴达易控modbus转profinet网关&#xff08;XD-MDPN100&#xff09;作为一个高性能的转换设备&#xff0c;能够稳定可靠地完成modbus和profinet之间的数据转…

2023最新最全【Python3.11.3】下载安装零基础教程【附安装包】

前言&#xff1a;链接在最底下 Python是一种可在多个平台上运行的计算机程序设计语言&#xff0c;它是一种高层次的脚本语言&#xff0c;结合了解释性、编译性、互动性和面向对象的特点。最初&#xff0c;它的设计目的是用于编写自动化脚本(shell)。但随着版本的更新和新功能的…

vue 城市选择器的使用 element-china-area-data

一、Element UI 中国省市区级联数据 本文参考&#xff1a;element-china-area-data - npm 1. 安装 npm install element-china-area-data -S2. 使用 import { provinceAndCityData, regionData, provinceAndCityDataPlus, regionDataPlus, CodeToText, TextToCode } from e…

学习模拟简明教程【Learning to simulate】

深度神经网络是一项令人惊叹的技术。 有了足够的标记数据&#xff0c;他们可以学习为图像和声音等高维输入生成非常准确的分类器。 近年来&#xff0c;机器学习社区已经能够成功解决诸如对象分类、图像中对象检测和图像分割等问题。 上述声明中的加黑字体警告是有足够的标记数…

git 构建报错

钉钉插件]当前任务未配置机器人&#xff0c;已跳过 org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: WorkflowScript: 4: Tool type “maven” does not have an install of “maven-3.8.8” configured - did you mean “Maven-3.8.8”? …

Docker Desktop 配置阿里云镜像加速

阿里云搜索镜像&#xff0c;打开容器镜像服务&#xff0c;复制镜像加速器地址 Docker Desktop 右上角设置&#xff0c;选择 Docker Engine&#xff0c;在配置中添加阿里云的镜像地址&#xff0c;右下 Apply & restart 即可。 "registry-mirrors": ["https…

android适配鸿蒙系统开发

将一个Android应用迁移到鸿蒙系统需要进行细致的工作&#xff0c;因为两者之间存在一些根本性的差异&#xff0c;涉及到代码、架构、界面等多个方面的修改和适配。以下是迁移工作可能涉及的一些主要方面&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专…

《Linux从练气到飞升》No.29 生产者消费者模型

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

机械人必须要了解的丝杆螺母参数

丝杆螺母是机械中重要的零部件之一&#xff0c;主要用于将旋转运动转化为直线运动&#xff0c;或者将直线运动转化为旋转运动。只有正确了解丝杆螺母的参数&#xff0c;才能进行选型。 1、螺纹规格&#xff1a;丝杆螺母的螺纹规格是按照国家标准进行分类的&#xff0c;常见的有…

设置chunk自动扩展到多大

1. 设置chunk自动扩展 execute function task(modify chunk extendable on,8); 2. 设置dbs扩展到多大合适 execute function task(modify space sp sizes,testdb1024,1024,10240) testdb 初始1MB 下次扩1MB 最大10MB

leetcode算法之前缀和

目录 1.DP34[模板]一维前缀和2.DP35[模板]二维前缀和3.寻找数组的中心下标4.除自身以外数组的乘积5.和为K的子数组6.和可被K整除的子数组7.连续数组8.矩阵区域和 1.DP34[模板]一维前缀和 一维前缀和 #include <iostream> #include <vector> using namespace std…

《视觉SLAM十四讲》-- 后端 2

文章目录 09 后端 29.1 滑动窗口滤波和优化9.1.1 实际环境下的 BA 结构9.1.2 滑动窗口法 9.2 位姿图9.2.1 位姿图的意义9.2.2 位姿图优化 09 后端 2 9.1 滑动窗口滤波和优化 9.1.1 实际环境下的 BA 结构 由于计算机算力的限制&#xff0c;我们必须控制 BA 的规模&#xff0c…

【教3妹学编程-算法题】最大和查询

3妹&#xff1a;2哥&#xff0c;你有没有看到新闻“18岁父亲为4岁儿子落户现身亲子鉴定” 2哥 : 啥&#xff1f;18岁就当爹啦&#xff1f; 3妹&#xff1a;确切的说是14岁好吧。 2哥 : 哎&#xff0c;想我30了&#xff0c; 还是个单身狗。 3妹&#xff1a;别急啊&#xff0c; 2…

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏4(附项目源码)

文章目录 先看本次实现的最终效果前言把敌人和炮塔全部配置成预制体炮塔商店打开商店放置炮塔升级炮塔出售显示炮塔攻击范围显示玩家金额和血量关闭升级面板和商店功能源码完结 先看本次实现的最终效果 前言 本期紧接着上一篇&#xff0c;本期主要内容是实现商店、购买、出售、…

js的File对象,Blob和file相互转换

示例 <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1" /><title>js的File对象&#xff0c;Blob和file相互转换</title><…

生成对抗网络Generative Adversarial Network,GAN

Basic Idea of GAN Generation&#xff08;生成器&#xff09;  Generation是一个neural network&#xff0c;它的输入是一个vector&#xff0c;它的输出是一个更高维的vector&#xff0c;以图片生成为例&#xff0c;输出就是一张图片&#xff0c;其中每个维度的值代表生…

中级程序员——uniapp和小程序面试题

&#x1f604;博主&#xff1a;小猫娃来啦 &#x1f604;文章核心&#xff1a;uniapp和小程序面试题 文章目录 用uniapp有遇到一些兼容性问题吗&#xff1f;uniapp最大的优点是什么&#xff1f;uniapp如何实现多端兼容&#xff1f;uniapp是如何做跨端适配的&#xff1f;常用的u…

lxml基本使用

lxml是python的一个解析库&#xff0c;支持HTML和XML的解析&#xff0c;支持XPath解析方式&#xff0c;而且解析效率非常高 XPath&#xff0c;全称XML Path Language&#xff0c;即XML路径语言&#xff0c;它是一门在XML文档中查找信息的语言&#xff0c;它最初是用来搜寻XML文…

打造智算中心新标杆,普洛斯数据中心荣获“2023年数据中心科技成果奖”一等奖

11月15&#xff0d;16日&#xff0c;由CDCC主办的2023第十一届数据中心标准大会在北京举行&#xff0c;大会同期举行“2023年数据中心科技成果奖”颁奖典礼。会上&#xff0c;普洛斯数据中心及美团联合申报的“智能算力中心弹性高效节能技术”荣获“2023年数据中心科技成果奖一…