답변:
업데이트 :이 답변은 Modern CMake 시대 이전입니다. 모든 정상적인 CMake 사용자는 CMAKE_CXX_FLAGS
직접 조작 하지 target_compile_options
말고 대신 명령을 호출해야 합니다. 권장 모범 사례를 제시 하는 mrts의 답변 을 확인하십시오 .
다음과 유사한 작업을 수행 할 수 있습니다.
if(MSVC)
# Force to always compile with W4
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
# Update if necessary
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")
endif()
/Wall
clang과 마찬가지로 경고에 대한 '감산'전략을 따르려는 경우 사용할 수 있습니다 -Weverything
. 활성화 할 경고를 선택하는 대신 모든 것을 활성화 한 다음 비활성화 할 특정 경고를 선택합니다.
최신 CMake에서는 다음이 잘 작동합니다.
if(MSVC)
target_compile_options(${TARGET_NAME} PRIVATE /W4 /WX)
else()
target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
endif()
제 동료가 대체 버전을 제안했습니다.
target_compile_options(${TARGET_NAME} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:/W4 /WX>
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wall -Wextra -pedantic -Werror>
)
${TARGET_NAME}
실제 대상 이름으로 바꿉니다 . -Werror
선택 사항이며 모든 경고를 오류로 바꿉니다.
또는 add_compile_options(...)
주석에서 @aldo가 제안한대로 모든 대상에 적용하려면 사용하십시오.
또한, 차이 이해해야합니다 PRIVATE
및 PUBLIC
(공공 옵션이 주어진 목표에 따라 목표에 의해 상속됩니다).
add_compile_options(...)
모든 대상에 적용하려는 경우.
else()
또는 에서 조건을 반복 할 필요가 없습니다 endif()
.
add_compile_options()
는 경고가를 통해 추가 된 대상으로 전파된다는 것 add_subdirectory()
입니다. 이러한 방식으로 외부 라이브러리를 포함하면 해당 라이브러리가 다른 경고 수준으로 디자인 된 경우 많은 경고를받을 수 있습니다.
내가 작성한 일부 CMake 모듈 에는 실험적인 교차 플랫폼 경고 억제 기능이 포함되어 있습니다 .
sugar_generate_warning_flags(
target_compile_options
target_properties
ENABLE conversion
TREAT_AS_ERRORS ALL
)
set_target_properties(
foo
PROPERTIES
${target_properties}
COMPILE_OPTIONS
"${target_compile_options}"
)
Xcode의 결과 :
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION
엑스 코드 속성 (일명 빌드 설정 -> 경고 -> 의심스러운 암시 적 변환 -> YES )-Werror
Makefile gcc 및 clang :
-Wconversion
,-Werror
비주얼 스튜디오:
/WX
,/w14244
지금까지 찾은 최고의 솔루션은 다음과 같습니다 (컴파일러 검사 포함).
if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)")
add_definitions(/W2)
endif()
그러면 Visual Studio에서 경고 수준 2가 설정됩니다. 나는 -W2
그것이 GCC에서도 작동 한다고 생각 합니다 (예상되지 않음).
@Williams의 업데이트 : -Wall
GCC 용 이어야합니다 .
-W -Wall -Wextra -pedantic
입니다. -Wextra
IIRC -W
는 이후 버전의 GCC에서 대체 되었지만 호환성을 위해 둘 다 남겨 둡니다.
당으로 Cmake 3.17.1 문서 :
if (MSVC)
# warning level 4 and all warnings as errors
add_compile_options(/W4 /WX)
else()
# lots of warnings and all warnings as errors
add_compile_options(-Wall -Wextra -pedantic -Werror)
endif()
GCC와 Clang은 이러한 플래그를 공유하므로 3 개를 모두 포함해야합니다.
add_compile_options
디렉토리 전체에 해당하는 반면 target_compile_options
단일 대상에만 해당됩니다.
if(MSVC)
string(REGEX REPLACE "/W[1-3]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()
당신이 사용하는 경우 target_compile_options
- cmake 두 번 사용하려고합니다 /W*
컴파일러가 경고를 줄 것이다 플래그를.
add_compile_options
수많은 경고를 얻었 /W3
습니다 /W4
. CMake가이 기초적인 옵션 (경고 수준 설정)을 다루지 않는다는 사실은 믿을 수 없습니다.
/Wall
플래그 (이름EnableAllWarnings
)를 지원합니다. 보다 더 많은 경고를 생성합니다/W4
. 그러나 내 경험상 너무 많은 경고를 생성합니다.