2016-01-21 93 views
0

我有2臺機器,兩臺機器都有相同的代碼副本。這兩臺機器都安裝了相同的Visual Studio,VS2013終極版本當Visual Studio生成32位.obj文件和64位.obj文件?

該代碼是一個包含大量Windows API的QT項目。因此,qmake將生成Makefile,Makefile.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位的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 
+1

你正在使用哪個Qt版本?確保您使用64位版本的64位編譯器。對於Qt創建者:工具 - >選項 - >構建和運行 - >套件 – Jeka

+0

我使用QT社區5.5.1。該工具包應該是正確的。這是msvc2013_64。 – Finix

回答

1

Visual Studio爲不同的體系結構提供了不同的編譯器(即cl.exe二進制文件)。

檢查哪個編譯器實際上被QT創建者調用(對於x64體系結構,它應該是<MS VS Dir>/VC/bin/amd64/cl.exe)。我猜測它是來自您的環境中的默認設置(PATH變量),或者您必須正確設置QT Creator才能爲正確的架構進行構建。

+0

你說得對。 QT Creator只是從%PATH%中選擇cl.exe。我將路徑從「..../bin」更改爲VC文件夾中的「...../bin/amd64」,然後解決此難題! – Finix

相關問題