Visual Studio什么时候生成32位.obj文件和64位.obj文件?
When Visual Studio generates 32bit .obj file and 64bit .obj file?
我有两台机器,两台机器都有相同的代码副本。两台机器都安装了相同的Visual Studio、VS2013终极版。
该代码是一个包含大量 Windows API 的 QT 项目。因此,qmake
将生成 Makefile
、Makefile.Debug
和 Makefile.Release
。这些 Makefile
在两台机器上都是相同的。
在Makefile.Debug
和Makefile.Release
中,实际的编译器和linker是VS's cl and link
。 2台机器的区别是,一台是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
25=]。此操作将错误更改为 "yyy.obj: module machine type 'x86' conflicts with target machine type 'x64'"
。是的,这次 VS 的 link 知道目标机器应该是 '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
Visual Studio 为不同的体系结构提供不同的编译器(即 cl.exe 二进制文件)。
检查 QT Creator 实际调用了哪个编译器(对于 x64 架构,它应该是 <MS VS Dir>/VC/bin/amd64/cl.exe
)。我猜它要么来自您环境中的默认设置(PATH
变量),要么您必须正确设置 QT Creator 才能构建正确的架构。
我有两台机器,两台机器都有相同的代码副本。两台机器都安装了相同的Visual Studio、VS2013终极版。
该代码是一个包含大量 Windows API 的 QT 项目。因此,qmake
将生成 Makefile
、Makefile.Debug
和 Makefile.Release
。这些 Makefile
在两台机器上都是相同的。
在Makefile.Debug
和Makefile.Release
中,实际的编译器和linker是VS's cl and link
。 2台机器的区别是,一台是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
25=]。此操作将错误更改为 "yyy.obj: module machine type 'x86' conflicts with target machine type 'x64'"
。是的,这次 VS 的 link 知道目标机器应该是 '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
Visual Studio 为不同的体系结构提供不同的编译器(即 cl.exe 二进制文件)。
检查 QT Creator 实际调用了哪个编译器(对于 x64 架构,它应该是 <MS VS Dir>/VC/bin/amd64/cl.exe
)。我猜它要么来自您环境中的默认设置(PATH
变量),要么您必须正确设置 QT Creator 才能构建正确的架构。