c++ - Visual Studio 何时生成 32 位 .obj 文件和 64 位 .obj 文件?

标签 c++ qt .obj

我有两台机器,两台机器都有相同的代码拷贝。两台机器都安装了同样的Visual Studio,VS2013终极版

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

Makefile.DebugMakefile.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/

相关文章:

c++ - 了解运算符重载的效用

c++ - 在不同的编译器中定义汇编函数

qt - 使用 Qt 的服务器发送事件 (SSE)

c++ - 使用 opengl 从 .obj 文件加载立方体时无法绘制正确的立方体

c++ - LAPACK 求解线性方程组时缺少一个元素

c++ - 从 linux 套接字读取 "varint"

c++ - 构建 Qt 应用程序时如何运行 git 命令

qt - 如何使 wkhtmltopdf 在 Debian 9 "Stretch"上的 Odoo v10 中工作?

c++ - 从 C++ 中的 .obj 文件中读取整数