Odpowiedzi:
AKTUALIZACJA: Ta odpowiedź poprzedza erę współczesnego CMake. Każdy rozsądny użytkownik CMake powinien powstrzymać się od CMAKE_CXX_FLAGS
bezpośredniego manipulowania i wywołać target_compile_options
polecenie. Sprawdź odpowiedź mrts, która przedstawia zalecane najlepsze praktyki.
Możesz zrobić coś podobnego do tego:
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
przydaje się, jeśli chcesz stosować „subtraktywną” strategię ostrzeżeń, podobnie jak strategia clang -Weverything
. Zamiast wybierać ostrzeżenia do włączenia, włączasz wszystko, a następnie wybierasz określone ostrzeżenia do wyłączenia.
W nowoczesnym CMake dobrze działa:
if(MSVC)
target_compile_options(${TARGET_NAME} PRIVATE /W4 /WX)
else()
target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
endif()
Mój kolega zasugerował alternatywną wersję:
target_compile_options(${TARGET_NAME} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:/W4 /WX>
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wall -Wextra -pedantic -Werror>
)
Zastąp ${TARGET_NAME}
rzeczywistą nazwą celu. -Werror
jest opcjonalna, zamienia wszystkie ostrzeżenia w błędy.
Lub użyj, add_compile_options(...)
jeśli chcesz zastosować go do wszystkich celów, zgodnie z sugestią @aldo w komentarzach.
Pamiętaj też, aby zrozumieć różnicę między PRIVATE
i PUBLIC
(opcje publiczne będą dziedziczone przez cele zależne od danego celu).
add_compile_options(...)
jeśli chcesz zastosować go do wszystkich celów.
else()
lub endif()
.
add_compile_options()
polega na tym, że ostrzeżenia będą propagowane do celów dodanych przez add_subdirectory()
. Jeśli włączysz w ten sposób biblioteki zewnętrzne, możesz otrzymać wiele ostrzeżeń, jeśli ta biblioteka została zaprojektowana z innym poziomem ostrzeżenia.
Niektóre moduły CMake, które napisałem, obejmują eksperymentalne tłumienie ostrzeżeń międzyplatformowych :
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}"
)
Wynik dla Xcode:
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION
atrybut Xcode (inaczej ustawienia kompilacji -> ostrzeżenia -> podejrzane niejawne konwersje -> TAK )-Werror
Makefile gcc i clang:
-Wconversion
,-Werror
Studio wizualne:
/WX
,/w14244
Oto najlepsze rozwiązanie, jakie do tej pory znalazłem (w tym sprawdzenie kompilatora):
if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)")
add_definitions(/W2)
endif()
Spowoduje to ustawienie poziomu ostrzeżenia 2 w programie Visual Studio. Przypuszczam -W2
, że działałoby to również w GCC (niesprawdzone).
Aktualizacja z @Williams: Powinna być -Wall
dla GCC.
-Wall
i być może -Wextra
tak szczegółowa, jak na stronie gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
-W -Wall -Wextra -pedantic
. -Wextra
IIRC zastąpione -W
w późniejszej wersji GCC, ale dla zachowania kompatybilności zostawiam oba.
Zgodnie z dokumentacją 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 i Clang współużytkują te flagi, więc powinno to obejmować wszystkie 3.
add_compile_options
obejmuje cały katalog, a target_compile_options
dotyczy tylko jednego celu.
if(MSVC)
string(REGEX REPLACE "/W[1-3]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()
Jeśli używasz target_compile_options
- cmake spróbuje użyć podwójnej /W*
flagi, co da ostrzeżenie kompilatorowi.
add_compile_options
jedynego, aby uzyskać mnóstwo ostrzeżeń, które /W3
są zastępowane /W4
. Fakt, że CMake nie zajmuje się tą podstawową opcją (ustawieniem poziomu ostrzegawczego) jest nie do uwierzenia.
/Wall
flaga obsługi nowych wersji programu Visual Studio (co najmniej 2013) (o nazwieEnableAllWarnings
). Generuje jeszcze więcej ostrzeżeń niż/W4
. Jednak z mojego doświadczenia wynika o wiele za dużo ostrzeżeń.