web-dev-qa-db-ja.com

CMakeでC99を強制する( 'for'ループの初期宣言を使用するため)

たとえば、次のgccエラーを回避するために、CMakeにコンパイラのC99機能を有効にするためのポータブルな方法を探しています。

error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int s = 1; s <= in_para->StepNumber; s++){
^

また、どのコンパイラをチェックして、次のようなものを追加したくありません。

set(CMAKE_C_FLAGS "-std=c99") # that would be bad

だから私はこの投稿を見つけました: CMakeでC99を有効にする および関連する機能要求: 12300:CMakeにはC99を要求するクロスプラットフォームの方法がありません 。このマンティスのバグで私は target_compiler_features とその後、次のSOF回答が見つかりました: CMakeでC++ 11をアクティブにする方法?コンパイラのC++ 11サポートを検出する方法CMake

だから私の質問は:これtarget_compiler_featuresは、C機能だけでなくC機能も必要とする方法を提供しますか?これまでにこれを達成するための最もポータブルな方法は何ですか-現在、CMake 2.8.12.2を使用しています。 target_compiler_featuresはCMakeの最新リリースバージョン(3.0.0)にはありません。いつリリースされるか知っていますか?

24
Tarc

ライブラリや実行可能ファイルなどのターゲットを作成したら、CMakeLists.txtファイルに次のような行を追加します。

_set_property(TARGET tgt PROPERTY C_STANDARD 99)
_

ここで、tgtはターゲットの名前です。

これはCMake 3.1で追加されたと思います、そしてドキュメントはここにあります:

http://www.cmake.org/cmake/help/v3.1/prop_tgt/C_STANDARD.html

3.1より前のバージョンのCMakeをサポートする必要がある場合は、次のマクロを使用できます。

_macro(use_c99)
  if (CMAKE_VERSION VERSION_LESS "3.1")
    if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
      set (CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}")
    endif ()
  else ()
    set (CMAKE_C_STANDARD 99)
  endif ()
endmacro(use_c99)
_

そのマクロをトップレベルファイルに配置してどこからでも見えるようにしたら、C99コードを含むターゲットを定義するCMakeListsファイルの先頭にuse_c99()を書き込むだけです。

MacOSをターゲットとするclangユーザー向けのCMakeの問題#15943

CMakeとclangを使用してMacOSをターゲットにしている場合、 bug があり、_CMAKE_C_STANDARD_機能が機能しない可能性があります(コンパイラフラグを追加しない)。次のいずれかを実行してください。

  • cmake_minimum_required を使用して、CMake 3.0以降を要求するか、
  • projectコマンドの前にCMakeLists.txtファイルの先頭にある次のコードを使用して、ポリシーCMP0025をNEWに設定します。

    _# Fix behavior of CMAKE_C_STANDARD when targeting macOS.
    if (POLICY CMP0025)
      cmake_policy(SET CMP0025 NEW)
    endif ()
    _
25
David Grayson

以下をCMakeLists.txtファイルに追加して、もう一度cmakeを実行します。

set(CMAKE_C_FLAGS "std=c99")
0

CMakeListsを編集する

オンラインで追加> 2

set (CMAKE_C_STANDARD 99)

その後

cmake 3 ..
0
Digital Human