我有两台机器,两台机器都有相同的代码拷贝。两台机器都安装了同样的Visual Studio,VS2013终极版。
该代码是一个包含大量 Windows API 的 QT 项目。因此,qmake
将生成Makefile
、Makefile.Debug
和Makefile.Release
。这些 Makefile
在两台机器上都是一样的。
在Makefile.Debug
和Makefile.Release
中,实际的编译器和链接器是VS的cl和link
。两台机器的区别在于,一台是Windows 10,另一台是Windows 8.1。但是两台机器都是64位机器。
问题是,在 Windows 10 机器上,QT Creator 中的构建进度通过,但在 Windows 8.1 机器上,构建时会出现一个错误。
首先,错误是 “xxx.dll: LNK1112: 模块机器类型‘x64’与目标机器类型‘x86’冲突”
。我在这里知道 "xxx.dll"
确实是 'x64'
类型,我意识到 Windows 8.1 机器认为 "target machine type"是 X86
,因此我通过将 "/MACHINE:X64"添加到 LINKFLAG
来手动修改 Makefile.Debug
。此操作将错误更改为 “yyy.obj:模块机器类型‘x86’与目标机器类型‘x64’冲突”
。是的,这次 VS 的链接知道目标机器应该是“x64”,但看起来 VS 的编译器仍然将一些 cpp 文件编译为 32 位 .obj 文件。
我的问题是,为什么 VS 的 cl
认为它应该生成 32 位 obj 文件而不是 64 位 obj 文件?还有,如何让VS的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
最佳答案
Visual Studio 为不同的体系结构提供不同的编译器(即 cl.exe 二进制文件)。
检查 QT Creator 实际调用了哪个编译器(对于 x64 架构,它应该是 <MS VS Dir>/VC/bin/amd64/cl.exe
)。我猜它要么来自您环境中的默认设置(PATH
变量),要么您必须正确设置 QT Creator 才能构建正确的架构。
关于c++ - Visual Studio 何时生成 32 位 .obj 文件和 64 位 .obj 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34917071/