CMake oferuje wiele mechanizmów pobierania flag do kompilatora:
Czy jest jedna metoda, która jest preferowana w nowoczesnym zastosowaniu? Jeśli tak, dlaczego? Ponadto, w jaki sposób można używać tej metody w przypadku wielu systemów konfiguracyjnych, takich jak MSVC?
Odpowiedzi:
W przypadku nowoczesnego CMake (wersje 2.8.12 i nowsze) należy użyć
target_compile_options
, który wewnętrznie używa właściwości docelowych.CMAKE_<LANG>_FLAGS
jest zmienną globalną i najbardziej podatną na błędy w użyciu. Nie obsługuje również wyrażeń generatora , co może być bardzo przydatne.add_compile_options
opiera się na właściwościach katalogu, co jest dobre w niektórych sytuacjach, ale zwykle nie jest najbardziej naturalnym sposobem określania opcji.target_compile_options
działa na zasadzie docelowej (poprzez ustawienie właściwościCOMPILE_OPTIONS
iINTERFACE_COMPILE_OPTIONS
target), co zwykle daje najczystszy kod CMake, ponieważ opcje kompilacji dla pliku źródłowego są określane przez to, do którego projektu należy plik (a nie do którego katalogu jest umieszczony na dysku twardym). Ma to dodatkową zaletę, że automatycznie dba o przekazywanie opcji do zależnych celów, jeśli jest to wymagane.Mimo że są nieco bardziej szczegółowe, polecenia dla każdego celu pozwalają na dość precyzyjną kontrolę nad różnymi opcjami kompilacji i (z mojego osobistego doświadczenia) są najmniej narażone na bóle głowy na dłuższą metę.
Teoretycznie można również ustawić odpowiednie właściwości bezpośrednio za pomocą
set_target_properties
, aletarget_compile_options
zwykle jest to bardziej czytelne.Na przykład, aby ustawić opcje kompilacji celu
foo
na podstawie konfiguracji przy użyciu wyrażeń generatora, możesz napisać:źródło
target_compile_options
dodaj opcje, abyś mógł zmodyfikować ostatnią linię w ten sposób, aby była bardziej czytelna)COMPILE_OPTIONS
robi to właściwość katalogu. Możesz użyćadd_compile_options
polecenia, aby to ustawić. Opcje, w przypadku których jest to dobre podejście, są zwykle nieliczne.PUBLIC
wtarget_compile_options
?