Ответ 1
CMake добавляет -DNDEBUG
к CMAKE_C_FLAGS_ {RELEASE, MINSIZEREL} по умолчанию. Таким образом, вы можете использовать #ifndef NDEBUG
.
Я использую CMake для создания моих проектов в Windows (Visual Studio), а также на машинах Linux (gcc). Я хотел бы отметить некоторый код как "только отладку", например,
#ifdef DEBUG
//some logging here
#endif
Вопрос в том, какое определение компилятора доступно на всех платформах в стиле сборки "Отладка" CMake? DEBUG, похоже, не существует. (Я хочу иметь журнал или что-то еще, только когда тип сборки - Debug.)
CMake добавляет -DNDEBUG
к CMAKE_C_FLAGS_ {RELEASE, MINSIZEREL} по умолчанию. Таким образом, вы можете использовать #ifndef NDEBUG
.
Я бы предложил вам добавить собственное определение. Символ 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"
для визуальной студии.)
В 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
который поддерживает выражения генератора, который влияет на все цели.