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中的一个错误吗?
抱歉,我应该发布我使用的解决方法。
我没有使用“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)
不管怎样,这对我有用。我认为我不需要做任何其他事情就可以让它为我的特定项目工作。祝你好运!
归档时间: |
|
查看次数: |
3482 次 |
最近记录: |