Комментарии 19
catch2 потребуется установить, если у вас Linux, то используйте ваш пакетный менеджер
По-моему это из области вредных советов. Зависимости в системе это сплошные проблемы с версиями, лучше дать возможность скачать автоматом через FetchContent, сабрепы или ещё что-то. И в идеале предусматривать все возможные режимы работы, ведь вы пишете библиотеку, которая будет подключаться к другому проекту, которому тоже могут нужны те же зависимости. Используя find_package для fmt безусловно вы лишаете возможность подложить его сабмодулем. Хорошо про зависимости написано на хабре.
Хотелось бы ещё увидеть девелоперскую часть CMake, её нет в статье, а репа на гитхабе у меня выдаёт 404.
Небольшое имхо — вместо Valgrind лучше использовать address sanitizer. Собственно CMakeLists.txt
option(${PROJECT_NAME}_SANITIZE "Сборка приложения в режиме поиска утечек памяти" OFF)
if (${PROJECT_NAME}_SANITIZE)
include(Sanitize)
endif()Файл Sanitize.cmake
add_compile_options(-fsanitize=address)
add_link_options(-fsanitize=address)
target_compile_options(${PROJECT_NAME}_compiler_flags_c INTERFACE
"$<${gcc_like_c}:$<BUILD_INTERFACE:-fsanitize=address>>"
)
target_compile_options(${PROJECT_NAME}_compiler_flags_cxx INTERFACE
"$<${gcc_like_cxx}:$<BUILD_INTERFACE:-fsanitize=address>>"
)
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=undefined -fno-sanitize-recover=all
-fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=null -fno-sanitize=alignment")
set (CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")Если вываливаются адреса вместо текста, надо указать путь к символизатору, чтобы не делать каждый раз можно в main добавить
#ifndef __has_feature
// GCC does not have __has_feature...
#define __has_feature(feature) 0
#endif
#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
#ifdef __cplusplus
extern "C"
#endif
const char *__asan_default_options() {
// Clang reports ODR Violation errors in mbedtls/library/certs.c.
// NEED TO REPORT THIS ISSUE
return "symbolize=1:detect_stack_use_after_return=1:external_symbolizer_path=/usr/bin/llvm-symbolizer";
}
const char *__lsan_default_options() {
// Clang reports ODR Violation errors in mbedtls/library/certs.c.
// NEED TO REPORT THIS ISSUE
return "verbosity=1:log_threads=1:fast_unwind_on_malloc=0";
}
#endif
Но есть один минус — если собрали проект с включённым санитайзером, под отладкой не будут работать точки останова, собственно, как и сам санитайзер. Просто выключаешь и пересобираешь.
Если что, я в этом решении не уверен, хоть оно и работает, использовать на свой страх и риск, если кто-то подскажет что не так, буду очень рад.
catch2 потребуется установить, если у вас Linux, то используйте ваш пакетный менеджер
Какой смысл устанавливать catch2? У нас же cmake в руках???
Include(FetchContent)
FetchContent_Declare(
Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG v3.3.1)
FetchContent_MakeAvailable(Catch2)XXI на дворе. Почему так сложно сделать и распространить C++ библиотеку?
Не обязательно, я сделал для себя, для удобства
Спасибо!
А чтобы сделать проект на питоне, нужны библиотеки, написанные на плюсах :)
Надеюсь в следующих частях увидеть как для этой библиотеки настроить пайплайн на github, со сборкой релизов и публикацией в conan. По мне это одна из самых главных фишек библиотек, если она есть в package менеджерах - её будут использовать намного чаще.
Информация
- Сайт
- timeweb.cloud
- Дата регистрации
- Дата основания
- Численность
- 201–500 человек
- Местоположение
- Россия
- Представитель
- Timeweb Cloud
Создаем свою библиотеку на C++ с тестированием, CMake и блекджеком: часть 2