【发布时间】: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