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中的一个错误吗?
答案 0 :(得分:3)
经过一番调查,这只是CMake中的一个错误。
http://public.kitware.com/Bug/view.php?id=13511
修复它似乎已被推送到CMake 2.8.11版本。 :(
仍在寻找解决方法。
答案 1 :(得分: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”
当然,您可以将“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
无论如何,这对我有用。我不认为我必须做任何其他工作才能让它适用于我的特定项目。祝你好运!