5

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.

原因在更详细的输出中:

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 中的一个错误吗?

4

2 回答 2

3

经过一番调查,这只是 CMake 中的一个错误。

http://public.kitware.com/Bug/view.php?id=13511

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

仍在寻找解决方法。

于 2012-10-21T04:43:29.380 回答
0

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

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

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

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" )

如果您正在为多个平台构建,我发现检测我正在为 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

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

于 2013-01-25T07:22:32.180 回答