Как включить assert в режиме выпуска CMake?
CMake используется для компиляции некоторых файлов c++. Есть assert
вызовы в код. Эти вызовы отключены в режиме выпуска CMake. Он определяет NDEBUG
в режиме выпуска, я думаю.
Если меня интересует assert в режиме выпуска CMake, как его включить?
3 ответов
1
если вы заинтересованы в assert
функциональность только в вашем собственном коде, то простое решение
должен предоставить пользовательский assert. Например:
#if (MY_DEBUG)
# define MY_ASSERT(A) ... checks here ...
#else
# define MY_ASSERT(A) ... ignore A ...
#endif
использовать option
для включения / выключения assert:
# CMakeLists.txt
option(ENABLE_MY_ASSERT "Turn on MY_ASSERT checks" OFF)
if(ENABLE_MY_ASSERT)
add_definitions(-DMY_DEBUG=1)
else()
add_definitions(-DMY_DEBUG=0)
endif()
в этом случае у вас есть полный контроль над вашими проверками, вы можете проверить один компонент и игнорировать другие:
... FOO_DEBUG=0 BOO_DEBUG=1 BAR_DEBUG=0 ...
2
добавить пользовательский CMAKE_BUILD_TYPE (Также см. CMAKE_CONFIGURATION_TYPES):
cmake_minimum_required(VERSION 2.8.12)
project(foo)
set(CMAKE_CXX_FLAGS_MYREL "-O3")
add_library(foo foo.cpp)
выход:
# Debug
# ... -g ...
# Release
# ... -O3 -DNDEBUG ...
# RelWithDebInfo
# ... -O2 -g -DNDEBUG ...
# MyRel
# ... -O3 ...
Это было бы решением для компилятора MSVC:
string( REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
лучшим вариантом может быть включение утверждений не в режиме выпуска, а в режиме RelWithDebInfo:
string( REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
но это зависит от вашего проекта и предпочтений, конечно.
посмотреть ответ в CMake FAQ, т. е.:
исправьте это вручную, изменив определение переменных кэша CMAKE_C_FLAGS_RELEASE
и CMAKE_CXX_FLAGS_RELEASE
. Это необходимо делать каждый раз, когда вы настраиваете новый каталог сборки.
чтобы исправить это навсегда, создайте пользовательский файл правил CMake в исходной папке с требуемыми настройками для флагов выпуска (опустите опцию /D NDEBUG
). Затем в ваших внешних CMakeLists.txt укажите переменную CMAKE_USER_MAKE_RULES_OVERRIDE
к пользовательскому CMake файл правил.