Определить макрос препроцессора через CMake?

Как определить переменную препроцессора через CMake?

Эквивалентный код будет #define foo.

Ответ 1

Долгое время в CMake для этой цели add_definitions команда 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.

Точно так же вы можете сделать это для каждой цели, как объяснено в ответе Джима Хунцикера.

Ответ 2

Чтобы сделать это для конкретной цели, вы можете сделать следующее:

target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)

Это следует делать, если у вас есть более одной цели, которую вы строите, и вы не хотите, чтобы все они использовали одни и те же флаги. Также см. Официальную документацию по target_compile_definitions.

Ответ 3

Другое решение, предлагаемое на этой странице, полезно только для старых версий Cmake. Здесь решение для новой версии. Проверьте версию своего 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(....)