2016-04-25 34 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时获得适当的警告。

相关问题