Принятый ответ все еще работает, но устарел с 2013 года.
Этот ответ основан и на новых функциях из CMake v2.8.12, v3.3 и v3.13.
Начиная с CMake-2.8.12 (2013)
Две новые команды для установки CMAKE_CXX_FLAGS
:
Документация по последней версии не сильно изменилась с cmake-2.8.12 :
В васВы можете использовать:
target_compile_options(${TARGET} PRIVATE ${BUILD_FLAGS})
Или просто, если у вас есть одна цель:
add_compile_options(${BUILD_FLAGS})
Больше примеров
target_compile_options(mylib PRIVATE -O2) # only internal
target_compile_options(mylib INTERFACE -gl) # only external
target_compile_options(mylib PUBLIC -g) # same as PRIVATE + INTERFACE
# multiple targets and flags
target_compile_options(mylib1 mylib2 PRIVATE -Wall -Wextra)
target_compile_options( mylib PUBLIC -DUSEXX) # Bad
target_compile_definitions(mylib PUBLIC -DUSEXX) # OK
add_compile_options(-Wall -Wextra) # for all targets in current directory
add_compile_options(-DUSEXX) # Bad
add_definitions(-DUSEXX) # OK
Устаревший COMPILE_FLAGS
cmake-3.0 документация флаги COMPILE_FLAGS
как устаревшие:
COMPILE_FLAGS
Дополнительные флаги для использования при компиляцииисточники этой цели.
Свойство COMPILE_FLAGS
устанавливает дополнительные флаги компилятора, используемые для создания источников внутрицель.Используйте COMPILE_DEFINITIONS
для передачи дополнительных определений препроцессора.
Это свойство устарело.Вместо этого используйте свойство COMPILE_OPTIONS
или команду target_compile_options
.
Если вы все еще хотите использовать set_target_properties()
, вы можете использовать COMPILE_OPTIONS
вместо COMPILE_FLAGS
:
set_target_properties(${TARGET} PROPERTIES COMPILE_OPTIONS ${BUILD_FLAGS})
Начиная с CMake-3.3 (2015)
Антон Петров предлагает использовать генераторных выражений , как представлено в ответеar31 .
Генератор выражений CMake применяет ваш ${BUILD_FLAGS}
к:
- C ++ с использованием
$<COMPILE_LANGUAGE:CXX>
(также может быть C
, CUDA
...) - Clang-компилятор с использованием
$<CXX_COMPILER_ID:Clang>
(также может быть GNU
для gcc
или MSVC
для Visual C ++ ... см. полный список )
(используйте вместо $<C_COMPILER_ID:Clang>
, если язык C) - и более как поддерживаемая функция C ++ или версия компилятора ... (см. Документацию )
В вашем случае вы можете использовать:
target_compile_options(${TARGET} PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:${BUILD_FLAGS_FOR_CXX}>
$<$<COMPILE_LANGUAGE:C>:${BUILD_FLAGS_FOR_C}>)
или о компиляторах:
target_compile_options(${TARGET} PRIVATE
$<$<CXX_COMPILER_ID:Clang>:${BUILD_FLAGS_FOR_CLANG}>
$<$<CXX_COMPILER_ID:GNU>:${BUILD_FLAGS_FOR_GCC}>
$<$<CXX_COMPILER_ID:MSVC>:${BUILD_FLAGS_FOR_VISUAL}>)
Начиная с CMake-3.13 (2018)
Новая функция target_link_options()
позволяет передавать параметры компоновщику, как указано Крейг Скотт .
Различные параметры для файлов C и C ++
Лучший способ - различать файлы C и C ++, используя две разные цели.