Ваші спроби, наведені вище, додають додаткові прапорці до вашого файлу / цілі, а не перезаписування, як вам здається, очікуєте. Наприклад, з документів для Властивості вихідних файлів - COMPILE_FLAGS :
Ці прапори будуть додані до списку прапорів компіляції при створенні цього вихідного файлу.
Ви повинні мати змогу протиставити -Weffc++
прапор foo.cpp, зробивши це
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
Це повинно мати ефект додавання -Wno-effc++
після -Weffc++
в команді компілятора, і остання настройка виграє. Щоб побачити повну команду і перевірити, чи справді це так, ви можете зробити
make VERBOSE=1
Як і в стороні, один з супроводжуючих З стандартної бібліотекою GNU ++ являє собою досить негативну думку про -Weffc++
в цій відповіді .
Інший момент полягає в тому, що ви неправомірно використовуєте add_definitions
в тому сенсі, що використовуєте це для прапорів компілятора, а не для призначених визначень препроцесора.
Краще використовувати add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
або для версій CMake <3.0 зробити щось подібне:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
Відповідаючи на подальші запитання в коментарях нижче, я вважаю, що неможливо надійно видалити прапор з одного файлу. Причина полягає в тому, що для будь-якого даного вихідного файлу застосовано COMPILE_OPTIONS
та 1 його цільове призначення, але вони не відображаються в жодному з властивостей цього вихідного файлу.COMPILE_FLAGS
Ви можете подивитися, як зняти прапор проблеми з цілі COMPILE_OPTIONS
, а потім застосувати його до кожного з джерел цілі окремо, опустивши його з конкретного вихідного файлу у міру необхідності.
Однак, хоча це може спрацювати у багатьох сценаріях, у нього є кілька проблем.
Властивості файлів першого джерела не включають COMPILE_OPTIONS
, лише COMPILE_FLAGS
. Це проблема, оскільки COMPILE_OPTIONS
ціль може включати генераторні вирази , але COMPILE_FLAGS
не підтримує їх. Таким чином, вам доведеться розміщувати вирази генератора під час пошуку свого прапора, і справді вам, можливо, навіть доведеться "розбирати" вирази генератора, якщо ваш прапор міститься в одному або декількох, щоб побачити, чи слід його повторно застосовувати до решти вихідні файли.
Друге - оскільки CMake v3.0, цілі можуть визначати INTERFACE_COMPILE_OPTIONS
. Це означає, що залежність від вашої цілі може додати або змінити ціль COMPILE_OPTIONS
через її INTERFACE_COMPILE_OPTIONS
. Тому вам доведеться рекурсивно повторювати всі залежності вашої цілі (не особливо легке завдання, оскільки список LINK_LIBRARIES
цілі може також містити генераторні вирази), щоб знайти будь-які, які застосовують прапор проблеми, і спробувати видалити його з цих цілі " INTERFACE_COMPILE_OPTIONS
теж.
На цьому етапі складності я б хотів подати виправлення в CMake, щоб забезпечити функціональність для беззастережного видалення конкретного прапора з вихідного файлу.
1: Зауважте, що на відміну від COMPILE_FLAGS
властивості у вихідних файлах, COMPILE_FLAGS
властивість для цілей застаріле.