Visual Studio 11 ARM项目生成器失败

pet*_*snd 5 arm cmake windows-8 windows-runtime visual-studio-2012

CMake版本2.8.9

我正在为Windows 8编写一个在平板电脑上运行的应用程序.我编写了一个包含大部分应用程序逻辑的底层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.
Run Code Online (Sandbox Code Playgroud)

原因在于更详细的输出:

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 ==========
Run Code Online (Sandbox Code Playgroud)

默认情况下,"Visual Studio 11 ARM"生成器似乎不起作用,因为cl.exe不允许CMake测试编译器.

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

pet*_*snd 0

抱歉,我应该发布我使用的解决方法。

我没有使用“Visual Studio 11 ARM”生成器,而是改用 NMake 并且能够让它工作。CMake 的人员可能会在 2.8.11 版本中修复 Visual Studio 生成器。

使用 NMake 构建 ARM 的技巧就是在调用 cmake 之前运行批处理脚本来设置环境以进行交叉编译。或者,您也可以打开“VS2012 ARM Cross Tools Command Prompt”。批处理脚本位于:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_arm\vcvarsx86_arm.bat

我用于 cmake 的命令行是:

cmake -D "CMAKE_BUILD_TYPE=Debug" -G "NMake Makefiles" "path-to-CMakeLists.txt"

当然,您可以将“调试”替换为“发布”。我认为每个人都应该进行源代码构建,但您可以在与 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" )
Run Code Online (Sandbox Code Playgroud)

如果您正在为多个平台构建,我发现检测我正在为 ARM 构建以设置上述变量的一个好方法是检查环境:

STRING( TOLOWER "$ENV{Platform}" generator )
IF( generator STREQUAL "arm" )
Run Code Online (Sandbox Code Playgroud)

我认为最后一部分不是必要的,但我注意到 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 )
Run Code Online (Sandbox Code Playgroud)

全部完成后,只需运行:

nmake
Run Code Online (Sandbox Code Playgroud)

不管怎样,这对我有用。我认为我不需要做任何其他事情就可以让它为我的特定项目工作。祝你好运!