#ifdef DEBUG с CMake независимо от платформы

Я использую CMake для создания моих проектов в Windows (Visual Studio), а также на машинах Linux (gcc). Я хотел бы отметить некоторый код как "только отладку", например,

#ifdef DEBUG
//some logging here
#endif

Вопрос в том, какое определение компилятора доступно на всех платформах в стиле сборки "Отладка" CMake? DEBUG, похоже, не существует. (Я хочу иметь журнал или что-то еще, только когда тип сборки - Debug.)

Ответы

Ответ 1

CMake добавляет -DNDEBUG к CMAKE_C_FLAGS_ {RELEASE, MINSIZEREL} по умолчанию. Таким образом, вы можете использовать #ifndef NDEBUG.

Ответ 2

Я бы предложил вам добавить собственное определение. Символ CMake CMAKE_C_FLAGS_DEBUG может содержать флаги, используемые только в режиме отладки. Например:

C:

set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DMY_DEBUG")

C++:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DMY_DEBUG")

В своем коде вы можете написать следующее:

#ifdef MY_DEBUG
// ...
#endif

(Возможно, вам придется использовать "/DMY_DEBUG" для визуальной студии.)

Ответ 3

В CMake> = 2.8 используйте target_compile_definitions:

target_compile_definitions(MyTarget PUBLIC "$<$<CONFIG:DEBUG>:DEBUG>")

При компиляции в режиме отладки это определит символ DEBUG для использования в вашем коде. Он будет работать даже в таких средах разработки, как Visual Studio и Xcode, для которых cmake создает один файл для всех режимов компиляции.

Вы должны сделать это для каждой цели [1]. В качестве альтернативы вы можете использовать add_compile_options (Cmake> = 3.0):

add_compile_options("$<$<CONFIG:DEBUG>:-DDEBUG>")

Обратите внимание, что в последних версиях Visual C++ (по крайней мере, начиная с VS2015) разрешены параметры для одного или нескольких параметров, поэтому он должен нормально работать на всех компиляторах. Эта команда также полезна для других параметров компиляции, которые вы можете добавить ("/O2" в режиме выпуска для MSVC или "-O3" для режима выпуска в G++/Clang)

[1]: Примечание: в CMake> = 3.12 (в настоящее время бета-версия) есть также add_compile_definitions который поддерживает выражения генератора, который влияет на все цели.