Windows 8 Visual Studio 11 ARM项目生成器失败

Windows 8 Visual Studio 11 ARM项目生成器失败,windows-8,cmake,arm,windows-runtime,visual-studio-2012,Windows 8,Cmake,Arm,Windows Runtime,Visual Studio 2012,CMake版本2.8.9 我正在为Windows8编写一个在平板电脑上运行的应用程序。我编写了一个基础C++库,包含了我的大多数应用程序逻辑。我正在使用CMake编译这个C++库,因为我想为将来的端口建立一个平台无关的构建系统。 当我从命令行运行cmake.exe或使用cmake gui时,我可以使用“Visual Studio 11”和“Visual Studio 11 Win64”生成器生成项目。但是,当我尝试使用“Visual Studio 11 ARM”生成器时,出现以下错误: CMak

CMake版本2.8.9

我正在为Windows8编写一个在平板电脑上运行的应用程序。我编写了一个基础C++库,包含了我的大多数应用程序逻辑。我正在使用CMake编译这个C++库,因为我想为将来的端口建立一个平台无关的构建系统。 当我从命令行运行cmake.exe或使用cmake gui时,我可以使用“Visual Studio 11”和“Visual Studio 11 Win64”生成器生成项目。但是,当我尝试使用“Visual Studio 11 ARM”生成器时,出现以下错误:

CMake Error at C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:52 (MESSAGE):
  The C compiler "cl" is not able to compile a simple test program.
原因在更详细的输出中:

1>------ Build started: Project: cmTryCompileExec2764216458, Configuration: Debug ARM ------

1>C:\Program Files
(x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Platforms\ARM\PlatformToolsets\v110\Microsoft.Cpp.ARM.v110.targets(36,5):
error MSB8022: Compiling Desktop applications for the ARM platform is not supported.

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
默认情况下,“Visual Studio 11 ARM”生成器似乎不工作,因为cl.exe将不允许CMake测试编译器


我已经读到我可以完全关闭编译器检查,但这听起来像是一个糟糕的选择。这只是CMake中的一个bug吗?

经过调查,这只是CMake中的一个bug

修复它似乎已推送到CMake 2.8.11版本:(


仍在寻找解决方法。

对不起,我应该发布我使用的解决方法

我没有使用“Visual Studio 11 ARM”生成器,而是切换到了NMake,并且能够让它工作。CMake的同事可能会在他们的2.8.11版本中修复Visual Studio生成器

使用NMake为ARM构建的诀窍就是在调用cmake之前运行批处理脚本,该脚本将设置您的环境以进行交叉编译。或者,您也可以只打开“VS2012 ARM交叉工具命令提示符”。批处理脚本位于:

C:\ProgramFiles(x86)\Microsoft Visual Studio 11.0\VC\bin\x86\u arm\vcvarsx86\u arm.bat

我用于cmake的命令行是:

cmake-D“cmake\u BUILD\u TYPE=Debug”-G“NMake Makefiles”CMakeLists.txt的路径

当然,你可以用“Release”代替“Debug”。我认为每个人都应该进行源代码外构建,但你可以在与CMakeLists.txt相同的目录中运行该命令,并省略最后一个参数

为了成功构建,您需要在CMakeLists.txt中设置以下内容:

SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE" )
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE" )
如果您正在为多个平台进行构建,我发现一个很好的方法来检测我正在为ARM构建以设置上述变量,那就是检查环境:

STRING( TOLOWER "$ENV{Platform}" generator )
IF( generator STREQUAL "arm" )
我不认为最后一部分是必要的,但我注意到ARM SDK中缺少很多标准库,因此我设置这些库,通过以下设置排除所有不可用的库:

SET( CMAKE_C_STANDARD_LIBRARIES "kernel32.lib user32.lib ole32.lib oleaut32.lib uuid.lib advapi32.lib" 
     CACHE STRING "Libraries linked by default with all C applications." FORCE )
SET( CMAKE_CXX_STANDARD_LIBRARIES "kernel32.lib user32.lib ole32.lib oleaut32.lib uuid.lib advapi32.lib"
     CACHE STRING "Libraries linked by default with all C++ applications." FORCE )
完成后,只需运行:

nmake

无论如何,这对我来说是有效的。我认为我不需要做任何其他事情来让它为我的特定项目工作。祝你好运!

如果打开发生错误的目标文件,你会看到如果以下生成属性都不为真,就会发出此错误:
$(DesignTimeBuild)
$(WindowsSDKDesktopARMSupport)
$(WindowsAppContainer)
。您需要让CMake定义其中一个属性。如果此测试只是为了验证编译器是否可以生成某些内容,只需将
$(WindowsSDKDesktopARMSupport)
定义为true。我不知道如何让CMake定义此属性,但这必须是可能的。(我假设CMake不会尝试运行可执行文件,因为这样做是不可能的。)我在CMake.org上查找时发现了一个尚未解决的错误报告:一个类似的错误似乎已经解决:James,是否可以设置$(DesignTimeBuild),$(WindowsSDKDesktopARMSupport)或$(WindowsAppContainer)通过cl命令行的a/D参数?否,这些是MSBuild属性(即,在完整生成过程中使用的属性,编译器未使用)。CMake生成MSBuild项目文件,因此它可以设置这些属性。我不使用CMake,因此无法帮助您执行此操作(我确实不知道如何在这里进行配置)。祝您好运:-)您好,您找到了一个解决方法?符合测试项目的部分(CMAKE_TRY_COMPILE.sln)-我找不到任何CMAKE_TRY_COMPILE.sln文件。thx.CMAKE_TRY_COMPILE.sln是一个生成的文件。上面提到的Eld链接讨论了这个问题。我的项目与我的情况相同,我将尝试在这里查看它是否也适用于我。希望如此。一条评论。想法是使用CMAKE生成Nmake文件吗?(我不知道nmake)。当您运行nmake时,是否会生成VS解决方案?我仍然看到“它失败,输出如下:Change Dir:C:/Development/test/CMakeFiles/CMakeTmp”在cl简单测试中。当我从命令行执行此操作时,NMake不会提供VS解决方案。它只是从命令行生成代码。请参阅。我在x64中生成VS解决方案以开发和测试我的代码,然后使用NMake运行最终生成,无论是针对x64、x86还是ARM。