Bagaimana cara mengatur tingkat peringatan untuk sebuah proyek (bukan seluruh solusi) menggunakan CMake ? Harus bekerja di Visual Studio dan GCC .
Saya menemukan berbagai opsi tetapi sebagian besar tampaknya tidak berfungsi atau tidak konsisten dengan dokumentasinya.
cmake
warning-level
Wernight
sumber
sumber
/Wall
bendera (yang diberi namaEnableAllWarnings
). Ini menghasilkan lebih banyak peringatan daripada/W4
. Namun dari pengalaman saya, hal itu menghasilkan terlalu banyak peringatan./Wall
dapat digunakan jika Anda ingin mengikuti strategi 'subtraktif' untuk peringatan, seperti dentang-Weverything
. Alih-alih memilih peringatan untuk diaktifkan, Anda mengaktifkan semuanya dan kemudian memilih peringatan tertentu untuk dinonaktifkan.Di CMake modern, berikut ini bekerja dengan baik:
Rekan saya menyarankan versi alternatif:
Ganti
${TARGET_NAME}
dengan nama target yang sebenarnya.-Werror
bersifat opsional, ini mengubah semua peringatan menjadi kesalahan.Atau gunakan
add_compile_options(...)
jika Anda ingin menerapkannya ke semua target seperti yang disarankan oleh @aldo di komentar.Juga, pastikan untuk memahami perbedaan antara
PRIVATE
danPUBLIC
(opsi publik akan diwarisi oleh target yang bergantung pada target yang diberikan).sumber
add_compile_options(...)
jika Anda ingin menerapkannya ke semua target.else()
atauendif()
.add_compile_options()
adalah bahwa peringatan akan menyebar ke target yang ditambahkan melaluiadd_subdirectory()
. Jika Anda menyertakan pustaka eksternal dengan cara ini, Anda mungkin mendapatkan banyak peringatan jika pustaka itu dirancang dengan tingkat peringatan yang berbeda.Beberapa modul CMake yang saya tulis mencakup penekanan peringatan lintas-platfrom eksperimental :
Hasil untuk Xcode:
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION
atribut Xcode (alias pengaturan build -> peringatan -> konversi implisit yang mencurigakan -> YA )-Werror
Makefile gcc dan clang:
-Wconversion
,-Werror
Studio visual:
/WX
,/w14244
Tautan
sumber
Berikut adalah solusi terbaik yang saya temukan sejauh ini (termasuk pemeriksaan kompiler):
Ini akan menetapkan peringatan level 2 di Visual Studio. Saya kira dengan
-W2
itu akan bekerja di GCC juga (belum teruji).Pembaruan dari @Williams: Seharusnya
-Wall
untuk GCC.sumber
-Wall
dan mungkin-Wextra
seperti yang dijelaskan di gcc.gnu.org/onlinedocs/gcc/Warning-Options.html-W -Wall -Wextra -pedantic
.-Wextra
IIRC diganti-W
di versi GCC yang lebih baru, tetapi saya meninggalkan keduanya demi kompatibilitas.Sesuai dokumentasi Cmake 3.17.1 :
GCC dan Clang berbagi tanda ini, jadi ini harus mencakup semua 3.
sumber
add_compile_options
adalah seluruh direktori, sedangkantarget_compile_options
hanya untuk satu target.Jika Anda menggunakan
target_compile_options
- cmake akan mencoba menggunakan/W*
flag ganda , yang akan memberikan peringatan oleh compiler.sumber
add_compile_options
satu - satunya untuk mendapatkan banyak peringatan yang/W3
sedang diganti/W4
. Fakta bahwa CMake tidak menangani opsi dasar ini (pengaturan tingkat peringatan) tidak dapat dipercaya.