Yanıtlar:
GÜNCELLEME: Bu cevap Modern CMake döneminden öncedir. Her mantıklı CMake kullanıcısı, CMAKE_CXX_FLAGS
doğrudan uğraşmaktan kaçınmalı ve target_compile_options
bunun yerine komutu çağırmalıdır . Önerilen en iyi uygulamayı sunan mrts cevabını kontrol edin .
Buna benzer bir şey yapabilirsiniz:
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
tıpkı clang'lar gibi uyarılar için 'çıkarıcı' bir strateji izlemek istiyorsanız kullanılabilir -Weverything
. Etkinleştirmek için uyarıları seçmek yerine, her şeyi etkinleştirir ve ardından devre dışı bırakmak için belirli uyarıları seçersiniz.
Modern CMake'de aşağıdakiler iyi çalışıyor:
if(MSVC)
target_compile_options(${TARGET_NAME} PRIVATE /W4 /WX)
else()
target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
endif()
Meslektaşım alternatif bir versiyon önerdi:
target_compile_options(${TARGET_NAME} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:/W4 /WX>
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wall -Wextra -pedantic -Werror>
)
${TARGET_NAME}
Gerçek hedef adıyla değiştirin . -Werror
isteğe bağlıdır, tüm uyarıları hataya dönüştürür.
Ya add_compile_options(...)
da yorumlarda @aldo tarafından önerildiği gibi tüm hedeflere uygulamak istiyorsanız kullanın.
Ayrıca, PRIVATE
ve arasındaki farkı anladığınızdan emin olun PUBLIC
(genel seçenekler, verilen hedefe bağlı olan hedefler tarafından miras alınacaktır).
add_compile_options(...)
tüm hedeflere uygulamak istiyorsanız.
else()
veya içinde tekrarlanmasını gerektirmez endif()
.
add_compile_options()
, uyarıların, üzerinden eklenen hedeflere yayılmasıdır add_subdirectory()
. Harici kitaplıkları bu şekilde eklerseniz, bu kitaplık farklı uyarı düzeyiyle tasarlanmışsa birçok uyarı alabilirsiniz.
Yazdığım bazı CMake modülleri deneysel cross-platfrom uyarı bastırma içerir :
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 için sonuç:
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION
Xcode özniteliğini ayarlayın (aka yapı ayarları -> uyarılar -> şüpheli örtük dönüştürmeler -> EVET )-Werror
Makefile gcc ve clang:
-Wconversion
,-Werror
Görsel stüdyo:
/WX
,/w14244
Şimdiye kadar bulduğum en iyi çözüm (derleyici kontrolü dahil):
if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)")
add_definitions(/W2)
endif()
Bu, Visual Studio'da uyarı düzeyi 2'yi ayarlayacaktır. Sanırım bir ile -W2
GCC'de de işe yarayacak (test edilmemiş).
@ Williams'dan güncelleme: -Wall
GCC için olmalıdır .
-W -Wall -Wextra -pedantic
. -Wextra
IIRC -W
, GCC'nin sonraki bir sürümünde değiştirildi , ancak her ikisini de uyumluluk uğruna bırakıyorum.
Gereğince CKağıt 3.17.1 belgeleri :
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 ve Clang bu bayrakları paylaşır, bu nedenle bu, 3'ünü de kapsamalıdır.
add_compile_options
dizin çapındadır, oysa target_compile_options
yalnızca tek bir hedef içindir.
if(MSVC)
string(REGEX REPLACE "/W[1-3]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()
Eğer target_compile_options
- cmake kullanırsanız, çift /W*
bayrak kullanmaya çalışacaktır , bu da derleyici tarafından uyarı verecektir.
add_compile_options
sadece /W3
, geçersiz kılınan tonlarca uyarı almak için kullanıyordum /W4
. CMake'nin bu temel seçeneği ele almadığı gerçeği (uyarı seviyesini belirleme) inanılamaz.
/Wall
bayrağı (adlıEnableAllWarnings
) desteklediğine dikkat edin. Bundan daha fazla uyarı üretir/W4
. Ancak deneyimlerime göre çok fazla uyarı üretiyor.