2016-04-25 32 views
1

我正在研究一個基本的makefile文件,以測試編譯我們的備用Microsoft環境(如Windows Phone)的源代碼。我打開了一個VS2012 ARM開發人員命令提示符,並在makefile上運行nmake。這導致:爲什麼ARM的cl.exe嘗試從ARM開發人員命令行構建x86或x64應用程序?

nmake /f makefile.namke 
... 

cl /c cryptlib.cpp cpu.cpp... 

cryptlib.cpp 
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\crtdefs.h(338): 
fatal error C1189: #error: Compiling Desktop applications for the ARM platform is not supported. 
cpu.cpp 
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\crtdefs.h(338): 
fatal error C1189: #error: Compiling Desktop applications for the ARM platform is not supported. 
... 

NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 11.0 
\VC\BIN\x86_ARM\cl.EXE"' : return code '0x2' 
Stop. 

「桌面應用程序」是種曖昧的,所以我搜索微軟的術語的含義。看來,這意味着工具鏈構建基於x86或x64 Metro UI的應用程序。

我覺得我正在遭受斷開連接,或者微軟正在遭受斷開連接,他們的工具也有問題。

爲什麼微軟的ARM版本cl.exe試圖構建x86或x64應用程序而不是爲ARM編譯?或者爲什麼VS2012 ARM Developer Command Prompt設置爲x86或x64應用程序?


我也嘗試修復問題,但提出的解決方案不工作。所以現在我想了解最高級別的情況。

例如,one answer說要將<WindowsSDKDesktopARMSupport>true</WindowsSDKDesktopARMSupport>添加到ARM屬性表中,但這不起作用。 Another answer說要加CXXFLAGS = /D _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE,但那也沒用。


這個makefile就像測試微軟ARM工具鏈下的編譯一樣簡單。

LIB_SRCS = cryptlib.cpp cpu.cpp ... 
LIB_OBJS = cryptlib.obj cpu.obj ... 

TEST_SRCS = test.cpp bench1.cpp bench2.cpp ... 
TEST_OBJS = test.obj bench1.obj bench2.obj ... 

CXX = cl.exe /nologo 
AR = lib.exe 
CXXFLAGS = 

all: cryptest.exe 

cryptest.exe: $(TEST_OBJS) cryplib.lib 
    $(CXX) $(CXXFLAGS) /ref:cryplib.lib /out:[email protected] $(TEST_SRCS) 

cryplib.lib : $(LIB_OBJS) 
    $(CXX) $(CXXFLAGS) $(LIB_SRCS) 
    $(AR) $(LIB_OBJS) 
+0

_「...添加'CXXFLAGS =/D _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE',但那也行不通。「_ - 你的意思是字面意思,還是將其定義爲非零?該標題的第337行檢查其值,而不僅僅是它的存在。文件是否使用了一些在ARM上被任意禁用的Win32 API?在我遇到的每個例子中,「Desktop」總是指傳統的Win32,即不是WinRT或UWP。 – Notlikethat

回答

0

正確的解決辦法是添加類似於/D WINAPI_FAMILY=WINAPI_FAMILY_APP/D WINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP東西。

Windows SDK標頭包含三個不同的API子集目標,「桌面」,「應用程序」(Windows 8中引入的新「metro」風格應用程序)和「電話」。從Visual Studio中進行構建時,根據項目類型自動選擇正確的子集,但在通過調用cl.exe手動構建時,需要手動指定目標。 (所選目標限制標題中顯示的聲明,隱藏那些在更受限制的聲明中不可用的聲明。)

超出傳統,桌面是默認設置,但是在定位ARM時,您需要選擇其他的,因爲在ARM桌面模式下沒有公開支持第三方代碼的目標。 (WinRT平板電腦確實有桌面模式,但第三方不允許爲其構建應用程序。)

由於Windows 10和MSVC 2015不需要區分手機和應用程序,但應該使用「應用程序」。

建議的另一個標記_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE基本上告訴頭文件假裝你可以爲桌面API系列構建,即使是ARM。要使用它,你應該像這樣定義它:/D _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1(即只定義它是不夠的,你應該定義它到1)。對於不使用很多windows API的普通代碼,這應該也同樣適用,但更好的解決方案是聲明真實的API目標,以在嘗試使用不可用的API時獲得適當的警告。

相關問題