5

CMakeバージョン2.8.9

タブレットで実行するWindows8用のアプリを書いています。アプリケーションロジックの大部分を含む基盤となるC++ライブラリを作成しました。将来のポート用にプラットフォームに依存しないビルドシステムが必要なため、CMakeを使用してこのC++ライブラリをコンパイルしています。

コマンドラインからcmake.exeを実行するか、cmake-guiを使用すると、「VisualStudio11」および「VisualStudio11Win64」ジェネレーターを使用してプロジェクトを生成できます。ただし、「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 ==========

cl.exeではCMakeがコンパイラをテストできないため、デフォルトでは「VisualStudio11ARM」ジェネレータは機能しないようです。

コンパイラのチェックを完全にオフにできることを読みましたが、それは悪い選択のように思えます。これはCMakeの単なるバグですか?

4

2 に答える 2

3

いくつかの調査の後、これはCMakeの単なるバグです。

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

それを修正すると、CMake2.8.11リリースにプッシュされたようです。:(

まだ回避策を探しています。

于 2012-10-21T04:43:29.380 に答える
0

申し訳ありませんが、使用した回避策を投稿する必要がありました。

「VisualStudio11ARM」ジェネレーターを使用する代わりに、NMakeに切り替えて、動作させることができました。CMakeにいる人たちは、おそらく2.8.11リリースでVisualStudioジェネレーターを修正するでしょう。

NMakeを使用してARM用にビルドする秘訣は、cmakeを呼び出す前に、クロスコンパイルするように環境を設定するバッチスクリプトを実行することです。または、「VS2012 ARMCrossToolsコマンドプロンプト」を開くこともできます。バッチスクリプトは次の場所にあります。

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 に答える