Ответы:
В течение долгого времени CMake имел add_definitions
команду для этой цели. Однако недавно команда была заменена более тонким подходом (отдельные команды для определений компиляции, включают в себя каталоги и параметры компилятора).
Пример использования нового add_compile_definitions :
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)
Или:
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)
Хорошая часть этого заключается в том, что он обходит потертую хитрость, для которой CMake имеет место add_definitions
. CMake - такая потертая система, но они наконец-то обрели здравый смысл.
Дополнительную информацию о том, какие команды использовать для флагов компилятора, можно найти здесь: https://cmake.org/cmake/help/latest/command/add_definitions.html.
Точно так же вы можете сделать это для каждой цели, как объяснено в ответе Джима Ханзикера.
add_compile_definitions
кидает CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".
. Пришлось использовать add_compile_options(-D <your-def>)
вместо.
cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'
(не проверено)
https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitions
и начать менять номер версии вниз, пока страница не исчезнет. Это будет версия, где она еще не существует. В следующем шаге вы можете перейти в Whats new
раздел, чтобы найти новую команду или функцию. Так что это не так сложно.
Чтобы сделать это для конкретной цели, вы можете сделать следующее:
target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)
Это следует делать, если у вас есть более одной цели, которую вы строите, и вы не хотите, чтобы все они использовали одни и те же флаги. Также см. Официальную документацию по target_compile_definitions .
target_compile_definitions(my_target PRIVATE FOO=1)
отличается от set_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)
?
target_compile_definitions
задает значение для исполняемого файла / библиотеки WHOLE, где значение 'set_source_files_properties` устанавливает значение только для указанного файла. Команда Latter позволяет файлам компилироваться на другом языке; то есть: set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c
. Обратите внимание, что -x objective-c
здесь есть флаг, специфичный для GCC / Clang.
Другое решение, предлагаемое на этой странице, полезно для некоторых версий Cmake <
3.3.2
. Здесь решение для версии, которую я использую (т.е.3.3.2
). Проверьте версию своего Cmake с помощью$ cmake --version
и выберите решение, которое соответствует вашим потребностям. Документацию по cmake можно найти на официальной странице.
С CMake версии 3.3.2, чтобы создать
#define foo
Мне нужно было использовать:
add_definitions(-Dfoo) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
и, чтобы иметь определение макроса препроцессора, подобное этому:
#define foo=5
строка так изменена:
add_definitions(-Dfoo=5) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
add_definitions()
или target_compile_definitions()
. Более современная команда add_compile_definitions()
не была добавлена до CMake 3.12. @ Leos313