如何在 VS2012 下使用静态 MSVC 运行时静态构建 Qt 4.8/5.2,并支持 Windows XP?

2023-12-12

我想在 VS2012 下制作 Qt 4.8/5.2 的完全静态构建 - 包括静态运行时库,并针对 Windows XP 系统。 Qt 不支持开箱即用,因为即使是 Qt 的静态构建也使用动态链接的 MSVC 运行时。

这是一个规范问题,提供了成功构建满足这些要求的 Qt 所需的知识。


Qt 5.2

假设已为 XP 目标准备好环境,并且相关的 XP 目标qt5xp.patch以及错误修复qt5fixes.patch可用 - 均来自我的另一个答案,我们必须执行以下操作:

  1. 创建一个单独的win32-msvc2012-static and win32-msvc2012-static-xpqmake 规范通过复制它们qtbase/mkspecs/win32-msvc2012 and qtbase/mkspecs/win32-msvc2012-xp, 分别。

  2. 修改 qmake 规范。

  3. 向 configure 和 qmake makefile 传授有关新 qmake 规范的知识。

  4. 强制引导configure.exe通过创建一个空的.gitignore文件输入qtbase.

  5. 如果您正在配置 Qt-prefix为了使安装目录和构建目录是分开的,您必须应用补丁QTBUG-32519- 至少在该错误得到修复之前。

以下批处理文件完成完整的工作。目前,静态 Qt 构建禁用了 webkit 构建。

:: Assume that we're in an equivalent of C:\Qt prefix
@set PREFIX=%~dp0
:: Qt sources
@set QT=%PREFIX%..\5.2.1-src
:: Patch file(s)
@set SRC=%PREFIX%
@set SPEC=win32-msvc2012
@if not exist "%QT%\qt.pro" ( echo Qt source folder expected in %QT%>&2 & exit /b 1 )
::
@patch --forward --directory=%QT% -p0 --global-reject-file=%SRC%\qt5fixes.rej --input=%SRC%\qt5fixes.patch
::
@echo > %QT%\qtbase\.gitignore
@mkdir %QT%\qtbase\mkspecs\%SPEC%-xp
@copy %QT%\qtbase\mkspecs\%SPEC%\qplatformdefs.h %QT%\qtbase\mkspecs\%SPEC%-xp
@copy %QT%\qtbase\mkspecs\%SPEC%\qmake.conf %QT%\qtbase\mkspecs\%SPEC%-xp
@patch --forward --directory=%QT% -p0 --global-reject-file=%SRC%\qt5xp.rej --input=%SRC%\qt5xp.patch
::
@mkdir %QT%\qtbase\mkspecs\%SPEC%-static
@copy %QT%\qtbase\mkspecs\%SPEC%\qplatformdefs.h %QT%\qtbase\mkspecs\%SPEC%-static
@copy %QT%\qtbase\mkspecs\%SPEC%\qmake.conf %QT%\qtbase\mkspecs\%SPEC%-static
@mkdir %QT%\qtbase\mkspecs\%SPEC%-static-xp
@copy %QT%\qtbase\mkspecs\%SPEC%-xp\qplatformdefs.h %QT%\qtbase\mkspecs\%SPEC%-static-xp
@copy %QT%\qtbase\mkspecs\%SPEC%-xp\qmake.conf %QT%\qtbase\mkspecs\%SPEC%-static-xp
@patch --forward --directory=%QT% -p0 --global-reject-file=%SRC%\qt5static.rej --input=%SRC%\qt5static.patch

To undo对 Qt 源的更改,运行以下命令,并设置如上的变量:

@patch --reverse --directory=%QT% -p0 --global-reject-file=%SRC%\qt5static-unfix.rej --input=%SRC%\qt5static.patch
@del %QT%\qtbase\mkspecs\%SPEC%-static\qplatformdefs.h
@del %QT%\qtbase\mkspecs\%SPEC%-static\qmake.conf
@rmdir %QT%\qtbase\mkspecs\%SPEC%-static
@del %QT%\qtbase\mkspecs\%SPEC%-static-xp\qplatformdefs.h
@del %QT%\qtbase\mkspecs\%SPEC%-static-xp\qmake.conf
@rmdir %QT%\qtbase\mkspecs\%SPEC%-static-xp
::
@patch --reverse --directory=%QT% -p0 --global-reject-file=%SRC%\qt5xp-unfix.rej --input=%SRC%\qt5xp.patch
@del %QT%\qtbase\mkspecs\%SPEC%-xp\qplatformdefs.h
@del %QT%\qtbase\mkspecs\%SPEC%-xp\qmake.conf
@rmdir %QT%\qtbase\mkspecs\%SPEC%-xp
@del %QT%\qtbase\.gitignore
::
@patch --reverse --directory=%QT% -p0 --global-reject-file=%SRC%\qt5fixes-unfix.rej --input=%SRC%\qt5fixes.patch

然后通过执行来执行构建

configure -static -platform win32-msvc2012-static-xp (or win32-msvc2012-static)
jom (or nmake)
jom install (if doing the build separate from the installation directory)
# qt5static.patch
# Static MSVC Runtime Support for Qt 5.2
#
# Build qmake with XP targeting.
--- qtbase/qmake/Makefile.win32 2014-02-20 12:28:23.316380600 -0500
+++ qtbase/qmake/Makefile.win32 2014-02-20 12:29:07.396008900 -0500
@@ -42,7 +42,7 @@
               -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_NO_COMPONENT -DQT_NO_COMPRESS \
               -DQT_NO_THREAD -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -DQT_NO_DATASTREAM \
               -DUNICODE -DQT_CRYPTOGRAPHICHASH_ONLY_SHA1 -DQT_JSON_READONLY
-!if "$(QMAKESPEC)" == "win32-msvc2012-xp"
+!if "$(QMAKESPEC)" == "win32-msvc2012-xp" || "$(QMAKESPEC)" == "win32-msvc2012-static-xp"
 CFLAGS_BARE = $(CFLAGS_BARE) -D_USING_V110_SDK71_
 !endif
 CFLAGS   = -Yuqmake_pch.h -FIqmake_pch.h -Fpqmake_pch.pch $(CFLAGS_BARE) $(CFLAGS) $(EXTRA_CPPFLAGS)
# Add support for static qmake specs.
--- qtbase/qmake/Makefile.win32 2014-02-01 22:37:30.000000000 -0500
+++ qtbase/qmake/Makefile.win32 2014-02-17 16:21:09.329949100 -0500
@@ -1,4 +1,4 @@
-!IF "$(QMAKESPEC)" == "win32-msvc" || "$(QMAKESPEC)" == "win32-msvc.net" || "$(QMAKESPEC)" == "win32-msvc2002" || "$(QMAKESPEC)" == "win32-msvc2003" || "$(QMAKESPEC)" == "win32-msvc2005" || "$(QMAKESPEC)" == "win32-msvc2008" || "$(QMAKESPEC)" == "win32-msvc2010" || "$(QMAKESPEC)" == "win32-msvc2012" || "$(QMAKESPEC)" == "win32-msvc2012-xp" || "$(QMAKESPEC)" == "win32-msvc2013" || "$(QMAKESPEC)" == "win32-icc"
+!IF "$(QMAKESPEC)" == "win32-msvc" || "$(QMAKESPEC)" == "win32-msvc.net" || "$(QMAKESPEC)" == "win32-msvc2002" || "$(QMAKESPEC)" == "win32-msvc2003" || "$(QMAKESPEC)" == "win32-msvc2005" || "$(QMAKESPEC)" == "win32-msvc2008" || "$(QMAKESPEC)" == "win32-msvc2010" || "$(QMAKESPEC)" == "win32-msvc2012" || "$(QMAKESPEC)" == "win32-msvc2012-static" || "$(QMAKESPEC)" == "win32-msvc2012-static-xp" || "$(QMAKESPEC)" == "win32-msvc2012-xp" || "$(QMAKESPEC)" == "win32-msvc2013" || "$(QMAKESPEC)" == "win32-icc"
 
 !if "$(SOURCE_PATH)" == ""
 SOURCE_PATH = ..

# Set static runtime.
--- qtbase/mkspecs/win32-msvc2012-static/qmake.conf 2014-02-17 23:01:29.965440300 -0500
+++ qtbase/mkspecs/win32-msvc2012-static/qmake.conf 2014-02-17 23:05:51.630568400 -0500
@@ -24,9 +24,9 @@
 QMAKE_CFLAGS            = -nologo -Zm200 -Zc:wchar_t
 QMAKE_CFLAGS_WARN_ON    = -W3
 QMAKE_CFLAGS_WARN_OFF   = -W0
-QMAKE_CFLAGS_RELEASE    = -O2 -MD
-QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi
-QMAKE_CFLAGS_DEBUG      = -Zi -MDd
+QMAKE_CFLAGS_RELEASE    = -O2 -MT
+QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi -d2Zi+
+QMAKE_CFLAGS_DEBUG      = -Zi -MTd -d2Zi+
 QMAKE_CFLAGS_YACC       =
 QMAKE_CFLAGS_LTCG       = -GL
 QMAKE_CFLAGS_MP         = -MP
# Set static runtime.
--- qtbase/mkspecs/win32-msvc2012-static-xp/qmake.conf  2014-02-17 23:01:29.965440300 -0500
+++ qtbase/mkspecs/win32-msvc2012-static-xp/qmake.conf  2014-02-17 23:05:51.630568400 -0500
@@ -24,9 +24,9 @@
 QMAKE_CFLAGS            = -nologo -Zm200 -Zc:wchar_t
 QMAKE_CFLAGS_WARN_ON    = -W3
 QMAKE_CFLAGS_WARN_OFF   = -W0
-QMAKE_CFLAGS_RELEASE    = -O2 -MD
-QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi
-QMAKE_CFLAGS_DEBUG      = -Zi -MDd
+QMAKE_CFLAGS_RELEASE    = -O2 -MT
+QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi -d2Zi+
+QMAKE_CFLAGS_DEBUG      = -Zi -MTd -d2Zi+
 QMAKE_CFLAGS_YACC       =
 QMAKE_CFLAGS_LTCG       = -GL
 QMAKE_CFLAGS_MP         = -MP
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 VS2012 下使用静态 MSVC 运行时静态构建 Qt 4.8/5.2,并支持 Windows XP? 的相关文章

  • 包含 Qt 标头的正确方法是什么?

    到目前为止我知道几种方法 includeQt 类 include
  • QML改变图像颜色

    我搜索了如何对图像进行着色 格式为 svg 或 png 我尝试用一 个填充图像的矩形覆盖我的图像 但由于我的图像不是矩形 它会给整个矩形着色 而不仅仅是图像 可以用qml改变图像颜色吗 或者 是否可以使用 QPixmap 更改 qt 使用
  • QObject多重继承

    我正在尝试在 C Qt 类中使用 mix 来提供一大堆具有通用接口的小部件 该接口是以这样的方式定义的 如果它被定义为其他小部件类的基类 那么小部件本身将具有这些信号 class SignalInterface public QObject
  • Qt 创建者 4.8.4。 Windows 7 - 64 位安装

    我在 QT 方面遇到了一些困难 我需要在学校使用它来完成一些 GUI 应用程序 我最近完成了以下步骤 1 mingw get inst 20120426 exefrom 来源锻造 http sourceforge net projects
  • 如何在不同的QT线程中创建一个窗口?

    我有一个应用程序 其中每个线程 主线程除外 都需要创建自己的窗口 我尝试创建一个线程然后调用this gt exec in the run功能 然而 在我接到那个电话之前我就收到了一个错误 ASSERT failure in QWidget
  • QMessageBox::about 可以根据标题长度调整大小吗?

    我想创建一个简单的 关于 对话框 但注意到QMessageBox about不会根据标题的长度调整其大小 由于字体较大 标题通常会更长 至少在我的桌面环境中 仅根据内容调整其大小 有没有办法确保对话框足够大以显示所有标题 我当然可以向 ab
  • 如何使用 qt 库中的调试符号为 qt 5.5 创建开发 shell

    我有一个开发外壳buildInputs条目包括qt55 qtbase 这很好用 今天 我在 qt 库中发生了段错误 我想要带有调试符号的 qt 库 我看了一下nixpkgs pkgs development libraries qt 5 5
  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • MSVC C4100:“应用程序”:未引用的形式参数警告

    使用 MSVC 编译时 以下代码会生成 C4100 警告 这怎么可能 显然引用了 应用程序 class ApplicationInfo public QObject Q OBJECT public static void initializ
  • 如何使用bind将成员函数作为函数指针传递?

    我试图将成员函数作为函数指针传递 这样我就不需要依赖单例或全局函数来处理 Qt 5 中的 Qt 消息 据我所知 我的 std function 是正确的类型 它具有正确的签名 并且绑定应该允许我插入隐式this指针 本质上是将成员函数传递为
  • MapItemView 在 dataChanged 信号后不会更新

    我正在使用 QMLMapItemView使用 C 的组件QAbstractListModel基于模型 这MapItemView当模型重置时 或者每当添加新项目或删除现有项目时 工作正常 但是 那MapItemView不反映对已添加项目的更改
  • 放大 QGraphicsView 时如何保持 QPen 像素宽度相同

    我编写了一个快速而令人讨厌的程序来帮助我可视化我正在从事的项目的一个方面 尽管我从 4 1 1 开始就开始使用 Qt 但我从未真正需要使用 QGraphics 模块 当我开始使用该程序时 我正在一台运行 Windows XP Qt4 7 0
  • 构建qt程序时未定义的符号:找不到qt_version_tag

    我正在学习Qt5 6 我正在使用 Ubuntu 14 4 当我链接我的程序时 出现以下错误 undefined reference to qt version tag 在 CMakeLists txt 中 link libraries Qt
  • 如何通过信号和槽传递参数?

    我的 GUI 包括LineEdit and a 按钮 当 的时候按钮单击后 插槽clicked 叫做 我想在之间建立信号槽关系clicked 作为信号和doSomething 作为插槽 问题是doSomething 无权访问 UI 并且do
  • PyQt:如何通过匿名代理使用网页

    这真让我抓狂 我想在 QWebPage 中显示一个 url 但我想通过匿名代理来实现 Code setting up the proxy proxy QNetworkProxy proxy setHostName 189 75 98 199
  • 我如何告诉 QTableWidget 结束编辑单元格?

    我正在显示一个弹出菜单来选择 QTableWidget 中的某些值 最下面的项目是 修改列表 条目 当我选择它时 应自动出现一个新窗口 并且 QComboBox 应消失 并且单元格返回到 Qt DisplayRole 状态 现在 Qt 拥有
  • Qt - 意外的 GDB 退出

    我正在尝试开发一个应用程序 该应用程序创建图像并使用双线性插值填充颜色像素 然后显示它 到目前为止我的代码如下 include
  • Qmake 不支持源目录下的构建目录

    我创建了一个可以在 OS X 上编译和运行的应用程序 我现在想开始让它在 Windows 上运行 首先 我将项目复制到 Windows 机器上并尝试编译 但收到此错误 警告 Qmake不支持源目录下的构建目录 有任何想法吗 将影子构建目录设
  • 使用 VSTest 代替 MSTest 运行单元测试用例

    我在 TFS2010 服务器上有一个 x64 平台 C 解决方案 VS2012 我已将一个单元测试项目 也是 x64 附加到此解决方案并创建了一个构建定义 当我对构建进行排队时 它成功了 但单元测试用例不会被执行 这是因为 MSTest 是
  • 使用 QPrinter 打印第 x 页(共 y 页)

    我使用 qt 从 html 代码生成 pdf 文件 QTextDocument document new QTextDocument document gt setHtml htmlContent QPrinter printer QPri

随机推荐

  • 不同实体值具有相同同义词的对话流歧义

    我在使用对话流 api ai 开发代理时遇到问题 我使用了很多彼此不同的实体值 然而 某些实体值有类似的同义词 但代理仅返回一个值 我怎样才能获得所有可能的匹配或提出问题来解决歧义 例如我有一个意图 告诉我 ABC 特快列车的位置 if m
  • Java Spring + Jersey 子资源:在运行时注入构造函数参数

    我定义了以下方法 返回一个表示子资源定位器 泽西岛 的 bean Path slug public PageResource page PathParam slug String siteSlug throws AppException s
  • 如何禁止用户在 Groovy 脚本中做坏事?

    我计划将 Groovy 脚本引擎集成到我的游戏中 这样它将为游戏提供良好的可修改性 但是如何防止玩家编写邪恶的脚本 例如删除 C 驱动器上的所有文件 Groovy 包括类似库java io File默认情况下 因此一旦他们决定编写此类脚本
  • Swift - 如何检测方向变化

    我想将两个图像添加到单个图像视图 即横向一个图像和纵向另一个图像 但我不知道如何使用快速语言检测方向变化 我尝试过这个答案 但它只需要一张图片 override func viewWillTransitionToSize size CGSi
  • 如何在 Java 中使用密码保护压缩的 Excel 文件?

    我有一个关于保护 Excel 文件的密码的问题 情况是 我有一个 zip 文件 其中有一个 Excel 文件 我需要编写一个Java程序 以密码保护Excel文件 因此 用户应该能够解压缩该文件 zip 文件不需要受密码保护 但是 Exce
  • 如何在没有 EULA 的情况下启动 ChromeDriver.exe?

    我正在学习使用 Selenium v2 20 以领先于我们的一些程序员 他们很快将用它创建一些浏览器测试 我想在陷阱出现之前发现它们 而我无意中发现了一个 当我创建 ChromeDriver 时 它总是会弹出 Google Chrome E
  • 在 AS3 中从库加载和卸载内容

    我正在做一个 Flash 项目 但我对 ActionScript 很陌生 我在主页上有一个菜单 我想在单击菜单项时显示其他页面 我知道如何从库加载影片剪辑 但我不知道如何指定它们在屏幕上的位置以及如何使它们出现在特定层中 当我点击菜单的另一
  • 如果我们启用僵尸对象,所有弱引用都会被清空吗?

    通常 如果一个对象被释放 所有弱引用都将被清空 如果我们启用僵尸对象会怎么样 产品 gt 编辑方案 gt 启用僵尸对象 弱引用也会被置零吗 否则 在启用僵尸对象时会出现正常情况下不会发生的错误 正如其中一个答案所说 我强烈怀疑弱引用将被消除
  • 如何将秒转换为小时、分钟和秒?

    我有一个以秒为单位返回信息的函数 但我需要以小时 分钟 秒的形式存储该信息 有没有一种简单的方法可以在Python中将秒转换为这种格式 您可以使用datetime timedelta功能 gt gt gt import datetime g
  • 如何让 PHP 在出现错误时生成回溯?

    尝试使用 PHP 的默认仅当前行错误消息来调试 PHP 是可怕的 当产生错误时 如何让 PHP 产生回溯 堆栈跟踪 我的用于安装生成回溯的错误处理程序的脚本
  • 加载 jasperreports 的 .jrxml 文件

    在我的项目中 我将 jrxml 文件存储在名为 com bio ofm mnu views reports jasperReports 的包中 当我尝试加载 jrxml 时出现以下错误 net sf jasperreports engine
  • 将外部 SVG 文件加载到变量中并附加到 html

    我正在尝试用该 SVG 的内容替换嵌入 IMG 标签中的 SVG 图像 并将其内联输出 换句话说 将给定 IMG SRC 属性的 SVG 文件内容加载到变量中 并将其作为内联 SVG 注入 HTML 如下所示 else if type ty
  • 获取日期时间范围内的教室可用时间

    我正在使用 Oracle 11g 我遇到了这个问题 我还想不出任何想法来解决它 我有一张桌子 教室里有人 我需要找到的是日期时间范围之间的可用小时数 例如 我有A B C房间 占用教室表如下 Classroom start end A 10
  • 逐行循环遍历 char 数组

    我知道如何通过使用 fopen fgets 等读入 FILE 来逐行循环文件 但是我如何使用纯 C 逐行查看 char 数组 我用谷歌搜索了很多 只能找到从文件中读取的内容 include
  • E/MediaPlayer:错误(1,-19)

    我正在创建一个简单的音板 以便在用户单击按钮时播放声音 问题是 如果按钮按得足够多 通常大约 10 次 它最终会停止播放并显示错误E MediaPlayer error 1 19 我究竟做错了什么 我的播放声音的代码 private voi
  • React Native在调用/共享热点时检测IOS状态栏高度?

    ios 通话或分享个人热点时状态栏高度发生变化且与视图重叠 如何检测状态栏高度发生变化 我遇到过这个挑战 但还没有在 stackoverflow github 问题上找到答案 我提出了自己的解决方案 并将其发布 这样可以为其他人节省一些时间
  • 在 Mathematica 中计算自定义分布的期望

    这个问题建立在我在之前的问题上得到的很好的答案的基础上 能否在 Mathematica 中扩展 PDF CDF FindDistributionParameters 等功能 首先 我有两个自定义发行版的 PDF 和 CDF nlDist 和
  • 如何比较地图的身份或本例中发生了什么?

    我正在尝试比较两张地图的身份 package main import fmt func main a map int map int int 1 2 2 b a 1 c a 1 I can t do this if b c because
  • Android 套接字连接中出现错误“null”[重复]

    这个问题在这里已经有答案了 我想做什么 我正在尝试构建一个测试应用程序 目前只是通过套接字连接在 Android 手机 4 2 2 作为客户端 上的应用程序和在 pc windows 8 作为服务器 上运行的 java 应用程序之间建立连接
  • 如何在 VS2012 下使用静态 MSVC 运行时静态构建 Qt 4.8/5.2,并支持 Windows XP?

    我想在 VS2012 下制作 Qt 4 8 5 2 的完全静态构建 包括静态运行时库 并针对 Windows XP 系统 Qt 不支持开箱即用 因为即使是 Qt 的静态构建也使用动态链接的 MSVC 运行时 这是一个规范问题 提供了成功构建