Twoje próby powyżej dodają dalsze flagi do twojego pliku / celu, zamiast nadpisywać, jak się wydajesz. Na przykład z dokumentacji dotyczącej właściwości w plikach źródłowych - COMPILE_FLAGS :
Te flagi zostaną dodane do listy flag kompilacji podczas budowania tego pliku źródłowego.
Powinieneś być w stanie usunąć -Weffc++
flagę dla foo.cpp, wykonując
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
Powinno to skutkować dodaniem -Wno-effc++
po -Weffc++
w poleceniu kompilatora, a to drugie ustawienie wygrywa. Aby zobaczyć pełne polecenie i sprawdzić, czy tak jest, możesz to zrobić
make VERBOSE=1
Nawiasem mówiąc, jeden z opiekunów Biblioteki standardowej GNU C ++ przedstawia -Weffc++
w tej odpowiedzi dość negatywną opinię .
Inną kwestią jest to, że nadużywasz add_definitions
w tym sensie, że używasz tego do flag kompilatora, a nie do zamierzonych definicji preprocesorów.
Byłoby lepiej użyć add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
lub dla wersji CMake <3.0, aby zrobić coś więcej jak:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
W odpowiedzi na dalsze pytania w komentarzach poniżej uważam, że niemożliwe jest wiarygodne usunięcie flagi z pojedynczego pliku. Powodem jest to, że do dowolnego pliku źródłowego zastosowano cel COMPILE_OPTIONS
i 1 , ale nie pojawiają się one w żadnej z właściwości tego pliku źródłowego.COMPILE_FLAGS
Możesz spojrzeć na usunięcie flagi problemu z elementu docelowego COMPILE_OPTIONS
, a następnie zastosowanie go do każdego źródła celu indywidualnie, pomijając go w określonym pliku źródłowym zgodnie z wymaganiami.
Jednak, chociaż może to działać w wielu scenariuszach, wiąże się to z kilkoma problemami.
Po pierwsze - właściwości plików źródłowych nie obejmują COMPILE_OPTIONS
tylko COMPILE_FLAGS
. Jest to problem, ponieważ COMPILE_OPTIONS
element docelowy może zawierać wyrażenia generatora , ale COMPILE_FLAGS
ich nie obsługuje. Więc musiałbyś uwzględniać wyrażenia generatora podczas wyszukiwania swojej flagi, a nawet być może musiałbyś nawet "przeanalizować" wyrażenia generatora, jeśli twoja flaga była zawarta w jednym lub więcej, aby zobaczyć, czy powinna zostać ponownie zastosowana do pozostałych pliki źródłowe.
Po drugie - od CMake v3.0 cele mogą określać INTERFACE_COMPILE_OPTIONS
. Oznacza to, że zależność twojego celu może dodać lub nadpisać twój cel COMPILE_OPTIONS
poprzez jego INTERFACE_COMPILE_OPTIONS
. Więc dalej musiałbyś rekurencyjnie iterować przez wszystkie zależności twojego celu (nie jest to szczególnie łatwe zadanie, ponieważ lista LINK_LIBRARIES
dla celu może również zawierać wyrażenia generatora), aby znaleźć te, które stosują flagę problemu, i spróbować usunąć je z tych cele ” INTERFACE_COMPILE_OPTIONS
.
Na tym etapie złożoności chciałbym przesłać poprawkę do CMake, aby zapewnić funkcję bezwarunkowego usuwania określonej flagi z pliku źródłowego.
1: Zwróć uwagę, że w przeciwieństwie do COMPILE_FLAGS
właściwości w plikach źródłowych COMPILE_FLAGS
właściwość obiektów docelowych jest przestarzała.