ARM台式机程序能否使用Visual Studio 2012构建?

31

我曾在使用Visual Studio 2012 beta版本时,将我的桌面(win32)程序编译到ARM架构上没有遇到问题。

但是升级到Visual Studio 2012 RC版本后,编译器无法正常工作,并提示以下错误:

"不支持为ARM平台编译桌面应用程序"

我在论坛上看到了这个帖子: http://connect.microsoft.com/VisualStudio/feedback/details/745580/arm-configuration-doesnt-work

Microsoft是否真的要放弃在ARM上开发win32应用程序? 还是说在VS2012 beta中编译只是个偶然事件?


2
是的,你没有看错这篇文章。Windows RT(ARM架构下的Windows 8)不支持第三方桌面应用程序。因此,在Visual Studio中也无法开发它们。 - Jon
如果您是MSDN订阅者或者可以访问Windows Phone/Mobile代码,您应该看一下cl.exe。 - sgupta
1
现在一些聪明的人已经找到了在Windows RT上运行非微软签名代码的方法,mamaich的解决方案非常有用。不幸的是,如果您尝试重新编译程序,可能会发现一些重要的ARM LIB文件丢失。no2chem在XDA Developers上发布了一个帖子,解释了如何将DLL文件转换为LIB文件(您需要来自Windows RT设备的DLLS)。 - Quppa
我有一个正在执行此操作的DLL。如果我想在C#和XAML应用程序中使用该DLL,它仍然是“桌面应用程序”吗? - jocull
4个回答

47
您可以编辑文件:
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Platforms\ARM\Microsoft.Cpp.ARM.Common.props

<PropertyGroup> 部分添加以下行:

<WindowsSDKDesktopARMSupport>true</WindowsSDKDesktopARMSupport>

在 </PropertyGroup> 之前。

就这样,你可以使用VS2012构建ARM桌面应用程序。


@mamaich - 不是要冒犯,但微软批准了吗?(我正在寻找微软批准的方法来避免错误,因为这是一个真正的项目,而不是像XDA那样的黑客行为(无意冒犯XDA的人们))。 - jww
啊,这很有趣...这个技巧只修复了IDE。如果你进入命令行,你仍然会得到错误。回想起来,这是有道理的。 - jww
@onmyway133 我也遇到了同样的问题,我通过以管理员身份打开文件来解决它。 - Olivier
只能用VS 2012吗?还是可以使用VS 2015 Community?谢谢! - Jesuslg123
2
在VS2017中,我修改了以下文件,并且它可以正常工作:C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Platforms\ARM64\PlatformToolsets\v141\Toolset.targets。 - miradham
显示剩余2条评论

10
我通过在 C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_arm 使用 "/D _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE" 命令行参数给 ARM 版本的 cl 添加了一个小的 "hello world" cpp 文件,并成功绕过了该错误。我在 crtdefs.h 文件中找到了 sn0w 的回答中的 #define,而不必修改该文件。现在,我不能保证任何更复杂的东西实际上会起作用,或者 Microsoft 是否已经为 Windows RT 桌面应用程序实施了某种白名单或数字签名验证,因此即使它能够编译,当 Windows RT 最终发布时可能也不能运行。
请注意,在您可以从命令行运行 cl.exe 的 ARM 版本之前,您必须使用此批处理文件设置环境变量:"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_arm\vcvarsx86_arm.bat"。

2
只是一个小问题:当使用mamaich的技巧在Visual Studio下编译时,VS会应用/D _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1 - jww

4
即使您编译了应用程序,也无法在Windows 8 RT上运行未签名的应用程序。我刚测试过,不幸的是确实如此。您将收到以下消息:
Windows无法验证此文件的数字签名。我想可能有一种解决方法,但它永远不会得到官方支持。

1
这里有一些详细信息,向下滚动可以找到一个可能的解决方法... http://forum.xda-developers.com/showthread.php?p=31519618&postcount=1 - dodgy_coder

3
当然可以。我曾经使用VS2012 RC进行了练习。 现在,我将解释如何避免“不支持为ARM平台编译桌面应用程序”并构建win32应用程序。
第一种方法:修复构建工具 - 目标是修补(或尝试用beta版本替换)MSBuild的lib:Microsoft.Build.CPPTasks.Common.v110.dll
第二种方法:从Visual Studio Tools开始菜单中运行“VS2012 ARM Cross Tools Command Prompt”,然后执行cl [cl params] myfile1.cpp myfile2.cpp myres.res ... /link [linkparams]
对于这两种情况,您还需要在crtdefs.h的332行上注释#error指令。(Microsoft Visual Studio 11.0 \ VC \ include)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接