source

CMake에서 C99 강제 적용('for' loop 초기 선언 사용

ittop 2023. 10. 29. 20:00
반응형

CMake에서 C99 강제 적용('for' loop 초기 선언 사용

저는 다음을 피하기 위해 Cmake가 컴파일러의 C99 기능을 사용하도록 강제하는 휴대용 방법을 검색해 왔습니다.gcc예를 들어, 오류:

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 활성화 및 관련 기능 요청: 0012300: CMake는 C99를 요청할 크로스 플랫폼 방법이 없습니다.이 Mantis 버그에 대해 알게 되었고 그 후 SOF에 대한 답을 찾았습니다.CMake에서 C++11을 활성화하는 방법? 그리고 CMake로 컴파일러의 C++11 지원을 탐지하는 방법.

그래서 저의 질문은 다음과 같습니다.target_compiler_featuresC++ 기능뿐만 아니라 C 기능을 필요로 하는 방법을 제공할 것입니까?지금까지 이를 달성할 수 있는 가장 휴대하기 쉬운 방법은 무엇입니까? - 저는 현재 CMake 2.8.12.2를 사용하고 있습니다.target_compiler_featuresCMake의 최신 릴리스 버전(3.0.0)에는 없습니다.언제 개봉하는지 아시나요?

라이브러리 또는 실행 파일과 같은 대상을 만든 후 CMakeLists에 이와 같은 줄을 놓습니다.txt 파일:

set_property(TARGET tgt PROPERTY C_STANDARD 99)

어디에tgt목표물의 이름입니다.

이는 C Make 3.1에 추가된 것으로 생각되며, 설명서는 다음과 같습니다.

http://www.cmake.org/cmake/help/latest/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)

매크로를 어디에서나 볼 수 있도록 최상위 파일에 넣은 후에는 그냥 쓸 수 있습니다.use_c99()C99 코드가 포함된 대상을 정의하는 CMakeLists 파일의 맨 위에 있습니다.

C make issue #15943 macOS 대상 clang 사용자 대상

만약 당신이 CMake와 Clang을 사용하여 MacOS를 목표로 한다면, 그것을 야기할 수 있는 버그가 있습니다.CMAKE_C_STANDARD단순히 작동하지 않는 기능(컴파일러 플래그를 추가하지 않음).다음 중 하나를 수행해야 합니다.

  • Cmake 3.0 이상이 필요한 경우 Cmake_minimum_required를 사용하거나

  • 정책 CMP0025를 NEW로 설정하고 다음 코드를 CMakeList 상단에 표시합니다.txt 파일 앞에project명령:

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

이 질문이 계속해서 관심을 받고 있기 때문에 오늘 제가 생각하는 최선의 선택은 무엇인지 정리해 보겠습니다.

다음 명령은 C99를 다음에 대한 최소 요구 사항으로 설정합니다.target:

target_compile_features(target PUBLIC c_std_99)

저는 이 방법이 바람직한 방법이라고 생각합니다. 이 방법은 목표마다 적용되며, 목표를 통해 가시성을 제어할 수 있는 방법이기 때문입니다.PUBLIC,INTERFACE그리고.PRIVATEkeywords - 참조 참조.비록target_compile_features명령어는 3.1 버전에 도입되었고,c_std_99최소한 CMake 3.8이 필요합니다.

위와 유사하게, C99를 표준으로 설정하는 또 다른 방법.target는 다음과 같습니다.

set_property(TARGET target PROPERTY C_STANDARD 99)

이것은 C make 3.1부터 사용 가능합니다.표준을 적용하지 않는다는 단점이 있을 수 있습니다(참조 참조).이러한 이유로 설정합니다.C_STANDARD_REQUIRED유용한 속성:

set_property(TARGET target PROPERTY C_STANDARD_REQUIRED ON)

위의 두 속성은 각각 의 값으로 기본 설정됩니다.

따라서 모든 대상에 대해 C99를 기본값으로 설정할 수 있는 방법은 다음과 같습니다.

set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED TRUE)

참고 사항으로, 확장은target_compile_features접근법, 만약 당신이 관심을 가지는 것이 특정한 특징이라면 어떤 특정한 언어 표준을 요구할 필요가 없을지도 모릅니다.예를 들어 다음과 같이 설정합니다.

target_compile_features(target PUBLIC c_variadic_macros)

CMake는 다양한 매크로의 사용 가능성을 강제하는 적절한 플래그를 선택하는 데 주의를 기울일 것입니다.그러나 현재 C 언어에 사용할 수 있는 이러한 기능은 몇 가지뿐입니다. 전체 목록은 CMAKE_C_KNOWN_FEATURES를 참조하십시오. 루프 초기 선언은 그 중에 포함되지 않습니다.

liveevent에서 CMakeLists.txt에서 다음을 추가합니다.

set (CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}")

CMakeList 편집

온라인에서 추가하기 > 2

set (CMAKE_C_STANDARD 99)

그리고나서

cmake 3 ..

C_STANDARD 속성을 사용하면 전역이 아닌 특정 대상에 C 표준을 적용할 수 있습니다.다음은 C99를 적용할 것입니다.mytarget.

set_property(TARGET mytarget PROPERTY C_STANDARD 99)

C make 3.0.2부터는 add_compile_options(https://cmake.org/cmake/help/latest/command/add_compile_options.html#command:add_compile_options), 에서 C standart를 설정할 수 있는 가장 휴대성이 좋은 방법 중 하나입니다.

대상을 선언하기 전에 이 명령을 사용해야 합니다(add_library 또는 add_executable 포함).

아래는 C standart를 C99로 설정한 CMake 스크립트 예제입니다.

add_compile_options(-std=c99)
add_executable(my_exe ${SOURCES})

다음을 CMakeLists에 추가합니다.txt파일과 runcmake를 다시 만듭니다.

set(CMAKE_C_FLAGS "std=c99")

언급URL : https://stackoverflow.com/questions/24840030/forcing-c99-in-cmake-to-use-for-loop-initial-declaration

반응형