我觉得Win7就已足够,不想升级到Win8或Win10,但这个操作系统毕竟还是有点老了。预编译的qt-opensource-windows-x86-msvc2013_64-5.7.1.exe并不是“即装即用”,还需要进行一些设置。

环境

  • Windows 7 SP1 旗舰版, 64bit
  • Visual Studio Ultimate 2013
  • Qt5(qt-opensource-windows-x86-msvc2013_64-5.7.1.exe)

问题

使用默认配置安装Qt5开发环境后,使用Qt Creator新建Qt Console Application,构建出现如下错误:

1
LNK1104: cannot open file 'kernel32.lib'

不知道是不是因为撰写本文时我的系统已不再“干净”,记得好像还出现过找不到windows.h之类的错误。总之,新建的Qt工程无法通过编译。

解决方案

显然,系统中是存在kernel32.lib这个文件的,在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\x64目录下就有一份,于是在工程设置中修改LIBS变量定义:

1
LIBS += "-LC:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Lib/x64"

按照类似的思路,最终对工程设置的修改包括以下几项:

1
2
3
4
DEFINES += _USING_V110_SDK71_
INCLUDEPATH += "C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Include"
LIBS += "-LC:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Lib/x64"
RC_INCLUDEPATH += "C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Include"

添加_USING_V110_SDK71_宏定义是为了避免XXX重定义警告。这是我根据编译输出的提示,发现某个头文件对该宏进行了检测,在定义了该宏的情况下则不定义XXX而强行添加的。经过以上修改,工程终于可以编译通过了,运行也没有问题。

为了避免对每个新建工程都重复以上同样的修改,可以把这些修改合并到系统级的配置文件。经过查找,修改D:\Qt\Qt5.7.1\5.7\msvc2013_64\mkspecs\win32-msvc2013\qmake.conf是有效的,修改后的文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#
# qmake configuration for win32-msvc2013
#
# Written for Microsoft Visual C++ 2013
#
MSC_VER = 1800
MSVC_VER = 12.0
include(../common/msvc-desktop.conf)
load(qt_config)
DEFINES += _USING_V110_SDK71_
INCLUDEPATH += "C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Include"
LIBS += "-LC:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Lib/x64"
RC_INCLUDEPATH += "C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Include"

解释

我知道这是一种非官方的修改方:这不应该是事情的正确运行方式。在stackoverflow网站上也只是找到一些类似的问题,心里总觉得不太踏实。尤其是对添加_USING_V110_SDK71_这个宏定义,不知有何副作用。

发现如果不做任何更改,使用vs2013导入pro文件也无法编译,但是修改工程设置中的Platform Toolset后就可以:

应用该设置后展开C/C++选项卡下的Preprocessor页,发现也定义了_USING_V110_SDK71_,并且将windows库的路径设置为之前我向LIBS添加的路径:

似乎之前解决方案的效果,相当于在vs2013中指定使用v120_xp这个platform toolset。不算是完美的解释,至少也有了一个交代吧。

终极解决方案

Visual Studio 2013在Windows7操作系统进行Windows C++开发需要安装Windows SDK 8.1!即使我的vs2013安装包是4.8GB的Ultimate with sp5版本,依然不是完整的。据说如果在联网的情况下安装vs2013,相关SDK的下载安装会自动进行。

微软为这个sdk提供了在线安装程序,启动后可以选择在本机安装,或是下载后在其它计算机安装。下载后的文件约600多兆,目录结构如下:

1
2
3
4
5
6
7
8
9
10
E:\SETUP\WINDOWS SDK\V8.1 - X64
└─Windows Kits
└─8.1
└─StandaloneSDK
├─Installers
├─Patches
│ └─8.100.26936
└─Redistributable
├─4.5.50930
└─4.5.51641

运行StandaloneSDK/sdksetup.exe进行离线安装,装好以后恢复Qt默认设置,尼玛,no problem。并且安装了这个把QtCreator不能调试的问题也解决了。