当Visual Studio生成32位.obj文件和64位.obj文件时?

时间:2016-01-21 06:47:22

标签: c++ qt .obj

我有2台机器,两台机器都有相同的代码副本。这两台机器都安装了相同的Visual Studio, VS2013终极版

代码是一个包含大量Windows API的QT项目。因此,qmake将生成MakefileMakefile.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位对象?

我检查了两台机器上的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 个答案:

答案 0 :(得分:1)

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

检查QT创建者实际调用哪个编译器(对于x64架构,它应该是<MS VS Dir>/VC/bin/amd64/cl.exe)。我猜测它要么来自你环境中的默认设置(PATH变量),要么你必须正确设置QT Creator以构建正确的架构。