たとえば、次の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)にはありません。いつリリースされるか知っていますか?
ライブラリや実行可能ファイルなどのターゲットを作成したら、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()
を書き込むだけです。
CMakeとclangを使用してMacOSをターゲットにしている場合、 bug があり、_CMAKE_C_STANDARD
_機能が機能しない可能性があります(コンパイラフラグを追加しない)。次のいずれかを実行してください。
project
コマンドの前にCMakeLists.txtファイルの先頭にある次のコードを使用して、ポリシーCMP0025をNEWに設定します。
_# Fix behavior of CMAKE_C_STANDARD when targeting macOS.
if (POLICY CMP0025)
cmake_policy(SET CMP0025 NEW)
endif ()
_
以下をCMakeLists.txtファイルに追加して、もう一度cmakeを実行します。
set(CMAKE_C_FLAGS "std=c99")
CMakeListsを編集する
オンラインで追加> 2
set (CMAKE_C_STANDARD 99)
その後
cmake 3 ..