vs2017 编译Qt 5.11.2 源码

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.hqwc.cn/news/185788.html

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

相关文章

适用于 Mac 的 10 款最佳数据恢复工具

对于依赖计算机处理重要文件&#xff08;无论是个人照片还是重要业务文档&#xff09;的任何人来说&#xff0c;数据丢失都可能是一场噩梦。 值得庆幸的是&#xff0c;有多种数据恢复工具专门用于Mac用户&#xff0c;可以帮助您恢复丢失或意外删除的文件。 在本文中&#xff0c…

js实现tab栏切换

目录 1、排他思想实现 2、事件委托实现 1、排他思想实现 思路&#xff1a; 需要点击谁&#xff0c;就先获取谁&#xff0c;获得的是一个伪数组 遍历数组&#xff0c;并给数组里的每个元素添加点击事件&#xff0c;写一个active类用于显示边框样式 每一个元素对应一张图片&…

连新手小白都知道的电子画册一键生成器,你还不知道吗?

相信大家平时见得比较多的是纸质画册&#xff0c;而对于电子画册大家又了解多少呢&#xff1f;电子画册近年来倍受众多企业青睐&#xff0c;制作一本好的电子画册能够让企业在市场竞争中脱颖而出&#xff0c;给人以深刻印象。如何制作呢&#xff1f; 其实很简单&#xff0c;关…

电脑集中管理软件|局域网电脑集中管控怎么做

电脑集中管理软件|局域网电脑集中管控怎么做 电脑集中管理软件可以实现对员工工作情况的实时追踪&#xff0c;将工作效率情况采用可视化展示&#xff0c;管理者可根据图表发现员工工作效率低下的主要原因&#xff0c;并适当的调整&#xff0c;充分发挥员工的长处&#xff0c;从…

Python中表格插件Tabulate的用法

目录 一、引言 二、Tabulate插件安装与导入 三、Tabulate基本用法 1、创建表格&#xff1a; 2. 格式化表格&#xff1a; 3. 表格转置&#xff1a; 4、合并单元格&#xff1a; 5、指定每列的格式&#xff1a; 6、指定每行的格式&#xff1a; 7、使用自定义表格格式&am…

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

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

Docker Desktop 配置阿里云镜像加速

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

轻松一刻|Walrus CLI与CI/CD工具集成,轻松部署2048游戏

Walrus 是一款开源的基于平台工程理念、以应用为中心、以完整应用系统自动化编排交付为目标进行设计开发的云原生应用平台&#xff0c;简化和自动化应用部署与发布流程并与现有的 CI/CD 流水线无缝集成。今天我们来点有趣的&#xff0c;跟随本教程&#xff0c;一起将 Walrus CL…

《Linux从练气到飞升》No.30 深入理解 POSIX 信号量与生产消费模型

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

德思特案例 | Skydel GNSS仿真引擎助力多所高校实现GNSS仿真测试教育

来源&#xff1a;德思特测量测试 德思特案例 | Skydel GNSS仿真引擎助力多所高校实现GNSS仿真测试教育 目前高校研究机构很难拥有用于定位、导航和定时&#xff08;PNT&#xff09;的测试和模拟工具&#xff0c;卫星导航相关的教育基本都是通过教科书或基于Matlab代码编程进行研…

11.22文心中国行走进厦门,把握大模型时代的产业新机遇

11月22日&#xff0c;文心中国行将走进厦门。届时&#xff0c;政府、高校及企业的相关专家将现场分享AI和大模型最新进展&#xff0c;从人工智能政策解读&#xff0c;到大模型底层技术&#xff0c;再到产教融合下的空间感知与计算&#xff0c;产业创新应用洞察及实践案例等等&a…