CMake: когда использовать add_definitions вместо set_target_properties (целевые определения PROPERTIES COMPILE_DEFINITIONS)
В документации CMake можно прочитать:
add_definitions
Добавляет флаги в командную строку компилятора для источников в текущем каталоге и ниже.
Свойство COMPILE_DEFINITIONS в каталогах
COMPILE_DEFINITIONS: определения препроцессора для компиляции источников каталогов.
Свойство COMPILE_DEFINITIONS для целей
COMPILE_DEFINITIONS: определения препроцессора для компиляции целевых источников.
Свойство COMPILE_DEFINITIONS в исходных файлах
COMPILE_DEFINITIONS: определения препроцессора для компиляции исходного файла.
Функциональность
COMPILE_DEFINITIONS
и add_definitions
, похоже, перекрывается. COMPILE_DEFINITIONS
свойство кажется более гибким.
Итак, кажется, что свойство COMPILE_DEFINITIONS делает все add_definitions и даже больше.
Итак, в каких случаях мы должны называть add_definitions, поскольку свойство COMPILE_DEFINITIONS не может быть использовано?
Ответы
Ответ 1
add_definitions
существует в CMake с момента появления самой первой сборки CMake более десяти лет назад.
COMPILE_DEFINITIONS
- это просто новый, более гибкий и детальный способ сделать это.
Они всегда будут рядом: поскольку 99% + существующих файлов CMakeLists.txt
в мире используют add_definitions
, просто было бы неразумно удалять его. Разработчики CMake очень стараются поддерживать обратную совместимость... иногда в ущерб ясности и простоте. И иногда делают одно и то же по-разному разными способами.
Итак: add_definitions
в первую очередь полезен для настройки уже существующих файлов CMakeLists - для тех проектов, которые существовали до появления COMPILE_DEFINITIONS
. И поскольку эти проекты используют его, любые новые проекты, основанные на том, что люди узнают из чтения этих файлов CMakeLists, также вполне могут использовать add_definitions
.
Но если для ваших нужд достаточно использовать COMPILE_DEFINITIONS
, в этом нет ничего плохого.
Ответ 2
Я не говорю, что нужно использовать .
Это просто твоя привычка.
Некоторые рекомендации:
-
Используйте add_definitions, если вы хотите добавить в командную строку компилятора
для источников в текущем каталоге и ниже. Это будет короче
тип.
-
Используйте COMPILE_DEFINITIONS для точной настройки целевого или определенного
источники.
Ответ 3
Если вы хотите добавить compile definition for target
, вы можете использовать эту функцию target_compile_definitions
, которая более удобна - например, добавить несколько compile definitions
один раз, например:
add_executable (trie_io_test demo12.cpp)
target_compile_definitions(trie_io_test PRIVATE UNIT_TESTING=1 IO_TEST=1)
Вы можете увидеть этот вопрос , как установить несколько определений компиляции для целевого исполняемого файла, чтобы получить дополнительную информацию также из этого https://cmake.org/cmake/help/v3.0/command/target_compile_definitions.html.