Как определить переменную препроцессора через CMake?
Эквивалентный код будет #define foo
.
источник
Как определить переменную препроцессора через CMake?
Эквивалентный код будет #define foo
.
В течение долгого времени 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 .
источник
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, чтобы создать
Мне нужно было использовать:
и, чтобы иметь определение макроса препроцессора, подобное этому:
строка так изменена:
источник
add_definitions()
илиtarget_compile_definitions()
. Более современная командаadd_compile_definitions()
не была добавлена до CMake 3.12. @ Leos313