关于QT编译成的程序在winxp下运行提示不是有效win32应用程序的解决

解决QT应用程序在XP系统上运行的问题,通过修改pro文件加入特定配置实现XP平台兼容。涉及VS2013/2015 IDE配置,无需额外加载SDK版本。

昨天纠结了好长时间,今天才有点眉目,果然是QT的配置pro文件有点坑,需要加上以下内容以兼容XP平台

win32 {
    QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01
    QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE,5.01

    DEFINES += _ATL_XP_TARGETING
#    QMAKE_CFLAGS += /D _USING_V120_SDK71_
#    QMAKE_CXXFLAGS += /D _USING_V120_SDK71_
#    LIBS += -L$$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib)
#    INCLUDEPATH += $$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include)
}

一开始我以为是系统报毒,后来否决了。然后就是说的系统exe的配置有问题,最后是由于vs2013/2015以及以后IDE都有平台xp兼容性的配置,所以需要加上一些内容才可,至于网上说的加载sdk版本,其实用creator的话是不必加的。

 

之前遇到的一个问题,是关于输入法的,QT的lineedit控件是可以屏蔽中文输入的,只要设置lineEdit->setAttribute(Qt::InputMethodEnabled,false);但是低版本的vs环境是不支持的,应该是输入法的相关插件调用不起来,必须指定5.6以上版本的QT以及vs2013版本,至于低版本的如何屏蔽这个功能,后续会继续研究。

### 关于 QT 程序中 Kernel32.dll 的错误解决方案 在开发基于 Qt应用程序时,如果目标运行环境为 Windows XP 或其他较旧的操作系统,可能会遇到类似于“无法定程序输入点 XXX 于动态链接库 KERNEL32.dll 上”的错误。这种问题通常是由译器使用的 SDK 版本不兼容所引起的。 #### 原因分析 此问题的根本原因在于某些函数(如 `K32GetModuleFileNameExA`)仅存在于较高版本的 Windows 中,在较低版本操作系统(如 Windows XP)上并不存在这些函数。因此,当尝试在低版本系统上运行依赖高版本 API 的可执行文件时,就会触发此类错误[^4]。 为了使程序能够在更广泛的平台上正常工作,开发者需要调整项目的配置选项以确保其与目标平台兼容。 --- #### 解决方法 ##### 方法一:修改 PSAPI_VERSION 宏定义 可以通过更改项目源码中的宏定义来规避这一类问题。具体操作如下: ```cpp #define PSAPI_VERSION 1 #include <psapi.h> ``` 通过将 `PSAPI_VERSION` 设置为小于等于 1 的值,可以避免调用那些只存在新版本 Windows 平台上的高级功能接口。 ##### 方法二:指定正确的 MinGW 译工具链 如果你正在使用 MinGW 工具链构建你的 Qt 应用,则需确认选择了支持 WinXP 的 GCC/G++ 版本。例如,MinGW-w64 提供了一个专门针对老旧系统的分支——即 `-win32-seh` 和 `-posix-sjlj` 构建模式之一可能更适合这种情况。 另外还需要注意的是,部分现代 MinGW 发布版默认启用了 SSE/SSE2 指令集优化,默认情况下这可能导致生成的应用不适配非常老式的 CPU 处理器架构;此时可通过命令行参数禁用它们: ```bash -mno-sse -mno-sse2 ``` ##### 方法三:更新或替换 DLL 文件 尽管这种方法治标而不治本,但在紧急状况下也可以考虑手动下载对应版本号下的合法 Microsoft 提供之 kernel32.dll 替代品放置至应用同级目录或者全局 PATH 路径里覆盖掉原生有问题的那个副本[^3]。不过强烈建议优先采取前两种更为科学合理的手段处理根本矛盾所在之处! --- ### 总结 综上所述,对于 Qt 开发者来说,最推荐的做法是从源头出发修正代码逻辑以及选用恰当的译设置组合从而彻底消除跨不同世代之间存在的差异性隐患。这样不仅能够保障现有产品的稳定性还能极大程度减少未来维护成本开销。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值