2016-01-21 431 views
0

我有2台机器,两台机器都有相同的代码副本。这两台机器都安装了相同的Visual Studio,VS2013终极版本当Visual Studio生成32位.obj文件和64位.obj文件?

该代码是一个包含大量Windows API的QT项目。因此,qmake将生成Makefile,Makefile.DebugMakefile.Release。这两个机器上的Makefile是相同的。

Makefile.DebugMakefile.Release中,实际的编译器和链接器是VS's cl and link。两台机器的区别在于,一台是Windows 10,另一台是Windows 8.1。但两台机器都是64位机器。

问题是,在Windows 10机器上,QT Creator的构建过程通过,但在Windows 8.1机器上,构建时会出现一个错误。 首先,错误是"xxx.dll: LNK1112: module machine type 'x64' conflicts with target machine type 'x86'"。我在这里知道"xxx.dll"确实是'x64'类型,而我意识到Windows 8.1机器认为是"target machine type" is X86,所以我通过手动修改Makefile.Debug加入"/MACHINE:X64" to LINKFLAG。此操作将错误更改为"yyy.obj: module machine type 'x86' conflicts with target machine type 'x64'"。是的,这次VS的链接知道目标机器应该是'x64',但是它看起来像VS的编译器仍然将某些cpp文件编译为32位.obj文件。

我的问题是,为什么VS's cl认为它应该制作一个32位的obj文件而不是一个64位的obj文件?而且,如何让VS's cl制作一个64位的obj?

我检查了两台机器上的cl命令。它们如下所示。

cl -c -nologo -Zc:wchar_t -FS -Zi -MDd -GR -W3 
-w34100 -w34189 -w44996 -EHsc /Fd..\<some folder> 
-DXXX -IYYY -Fodebug\ @C:\Users\someuser>\AppData\Local\Temp\ZZZ.obj.8160.63.jom ZZZ.cpp 
+1

你正在使用哪个Qt版本?确保您使用64位版本的64位编译器。对于Qt创建者:工具 - >选项 - >构建和运行 - >套件 – Jeka

+0

我使用QT社区5.5.1。该工具包应该是正确的。这是msvc2013_64。 – Finix

回答

1

Visual Studio为不同的体系结构提供了不同的编译器(即cl.exe二进制文件)。

检查哪个编译器实际上被QT创建者调用(对于x64体系结构,它应该是<MS VS Dir>/VC/bin/amd64/cl.exe)。我猜测它是来自您的环境中的默认设置(PATH变量),或者您必须正确设置QT Creator才能为正确的架构进行构建。

+0

你说得对。 QT Creator只是从%PATH%中选择cl.exe。我将路径从“..../bin”更改为VC文件夹中的“...../bin/amd64”,然后解决此难题! – Finix