【问题标题】:Why does ARM's cl.exe try to build x86 or x64 app from ARM Developer Command Line?为什么 ARM 的 cl.exe 尝试从 ARM 开发人员命令行构建 x86 或 x64 应用程序?
【发布时间】:2016-08-19 09:21:30
【问题描述】:

我正在编写一个基本的 makefile 文件,以测试为其他 Microsoft 环境(如 Windows Phone)编译我们的源代码。我打开了一个 VS2012 ARM 开发人员命令提示符并在 makefile 上运行 nmake。结果是:

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.

“桌面应用程序” 有点含糊,所以我在 Microsoft 中搜索了该术语的含义。这似乎意味着该工具链正在构建基于 x86 或 x64 Metro UI 的应用程序。

我觉得我正在遭受断开连接,或者 Microsoft 正在遭受断开连接并且他们的工具有问题。

为什么微软的 ARM 版本的 cl.exe 试图构建 x86 或 x64 应用程序而不是为 ARM 编译?或者为什么要为 x86 或 x64 应用程序设置 VS2012 ARM 开发人员命令提示符?


我也尝试过解决问题,但建议的解决方案不起作用。所以现在我试图了解最高级别的情况。

例如,one answer 表示要将 <WindowsSDKDesktopARMSupport>true</WindowsSDKDesktopARMSupport> 添加到 ARM 属性表,但这不起作用。 Another answer 说要添加 CXXFLAGS = /D _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE,但这也没有用。


makefile 非常简单,可以在 Microsoft 的 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:$@ $(TEST_SRCS)

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

【问题讨论】:

  • "...add CXXFLAGS = /D _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE,但这也不起作用。" - 你的意思是字面意思,还是将其定义为非零值?该标头的第 337 行正在检查它的值,而不仅仅是它的存在。大概那些 cpp 文件正在使用一些在 ARM 上被任意禁止的 Win32 API?在我遇到的每一个例子中,“桌面”总是指的是旧版 Win32,即不是 WinRT 或 UWP。

标签: visual-studio-2012 windows-phone arm nmake


【解决方案1】:

正确的解决方案是添加类似于/D WINAPI_FAMILY=WINAPI_FAMILY_APP/D WINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP 的内容。

Windows SDK 标头具有三个不同的 API 子集目标,“desktop”、“app”(Windows 8 中引入的新“metro”风格应用)和“phone”。在 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 时获得适当的警告。

【讨论】:

    猜你喜欢
    • 2013-08-13
    • 2021-02-23
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    相关资源
    最近更新 更多