[英]When Visual Studio generates 32bit .obj file and 64bit .obj file?
我有2台機器,它們都具有相同的代碼副本。 這兩台機器都安裝了相同的Visual Studio VS2013 Ultimate版本 。
該代碼是具有許多Windows API的QT項目。 因此, qmake
將生成Makefile
, Makefile.Debug
和Makefile.Release
。 這些Makefile
在兩台計算機上都相同。
在Makefile.Debug
和Makefile.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
,因此我通過向"/MACHINE:X64" to LINKFLAG
添加"/MACHINE:X64" to LINKFLAG
手動修改了Makefile.Debug
。 此操作將錯誤更改為"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
Visual Studio為不同的體系結構提供了不同的編譯器(即cl.exe二進制文件)。
檢查哪個編譯器實際上被QT創建者調用(對於x64體系結構,它應該是<MS VS Dir>/VC/bin/amd64/cl.exe
)。 我猜想它要么來自您環境中的默認設置( PATH
變量),要么您必須正確設置QT Creator才能為正確的體系結構構建。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.