Upaya Anda di atas menambahkan flag lebih lanjut ke file / target Anda daripada menimpa seperti yang Anda harapkan. Misalnya, dari dokumen untuk Properti di File Sumber - COMPILE_FLAGS :
Tanda ini akan ditambahkan ke daftar tanda kompilasi saat file sumber ini dibuat.
Anda harus dapat -Weffc++
mengimbangi flag untuk foo.cpp dengan melakukan
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
Ini seharusnya memiliki efek menambahkan -Wno-effc++
setelah -Weffc++
dalam perintah kompilator, dan pengaturan terakhir menang. Untuk melihat perintah lengkap dan memeriksa apakah memang demikian, Anda dapat melakukannya
make VERBOSE=1
Selain itu, salah satu pengelola Perpustakaan Standar GNU C ++ memberikan pendapat yang cukup negatif -Weffc++
dalam jawaban ini .
Poin lainnya adalah Anda menyalahgunakan add_definitions
dalam artian Anda menggunakan ini untuk flag compiler daripada definisi preprocessor yang dimaksudkan.
Akan lebih baik jika digunakan add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
atau untuk CMake versi <3.0 untuk melakukan sesuatu yang lebih seperti:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
Menanggapi pertanyaan lebih lanjut di komentar di bawah, saya yakin tidak mungkin untuk menghapus bendera dengan andal pada satu file. Alasannya adalah karena untuk file sumber tertentu, ia memiliki target COMPILE_OPTIONS
dan 1 yang diterapkan, tetapi ini tidak muncul di properti mana pun untuk file sumber tersebut.COMPILE_FLAGS
Anda dapat melihat COMPILE_OPTIONS
menghapus tanda masalah dari target , lalu menerapkannya ke setiap sumber target secara individual, menghilangkannya dari file sumber spesifik sesuai kebutuhan.
Namun, meskipun ini bisa berhasil di banyak skenario, ini memiliki beberapa masalah.
Properti file sumber pertama tidak termasuk COMPILE_OPTIONS
, hanya COMPILE_FLAGS
. Ini menjadi masalah karena COMPILE_OPTIONS
target dapat menyertakan ekspresi generator , tetapi COMPILE_FLAGS
tidak mendukungnya. Jadi, Anda harus mengakomodasi ekspresi generator saat mencari flag Anda, dan bahkan Anda mungkin harus "mengurai" ekspresi generator jika flag Anda ada di satu atau lebih untuk melihat apakah harus diterapkan kembali ke yang tersisa file sumber.
Kedua - sejak CMake v3.0, target dapat ditentukan INTERFACE_COMPILE_OPTIONS
. Ini berarti bahwa ketergantungan target Anda dapat menambah atau mengganti target Anda COMPILE_OPTIONS
melalui itu INTERFACE_COMPILE_OPTIONS
. Jadi Anda selanjutnya harus mengulang secara rekursif melalui semua dependensi target Anda (bukan tugas yang sangat mudah karena daftar LINK_LIBRARIES
untuk target juga dapat berisi ekspresi generator) untuk menemukan yang menerapkan flag masalah, dan mencoba dan menghapusnya dari itu. target ' INTERFACE_COMPILE_OPTIONS
juga.
Pada tahap kompleksitas ini, saya akan mencari untuk mengirimkan tambalan ke CMake untuk menyediakan fungsionalitas untuk menghapus bendera tertentu tanpa syarat dari file sumber.
1: Perhatikan bahwa tidak seperti COMPILE_FLAGS
properti pada file sumber, COMPILE_FLAGS
properti pada target tidak digunakan lagi.