Обновить

Создаем свою библиотеку на C++ с тестированием, CMake и блекджеком: часть 2

Уровень сложностиСредний
Время на прочтение30 мин
Охват и читатели16K
Всего голосов 22: ↑22 и ↓0+29
Комментарии19

Комментарии 19

catch2 потребуется установить, если у вас Linux, то используйте ваш пакетный менеджер

По-моему это из области вредных советов. Зависимости в системе это сплошные проблемы с версиями, лучше дать возможность скачать автоматом через FetchContent, сабрепы или ещё что-то. И в идеале предусматривать все возможные режимы работы, ведь вы пишете библиотеку, которая будет подключаться к другому проекту, которому тоже могут нужны те же зависимости. Используя find_package для fmt безусловно вы лишаете возможность подложить его сабмодулем. Хорошо про зависимости написано на хабре.

Хотелось бы ещё увидеть девелоперскую часть CMake, её нет в статье, а репа на гитхабе у меня выдаёт 404.

github.com/alexeev-prog/libnumerixpp

Спасибо!

Небольшое имхо — вместо 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

Но есть один минус — если собрали проект с включённым санитайзером, под отладкой не будут работать точки останова, собственно, как и сам санитайзер. Просто выключаешь и пересобираешь.

Если что, я в этом решении не уверен, хоть оно и работает, использовать на свой страх и риск, если кто-то подскажет что не так, буду очень рад.

Исправил: github.com/alexeev-prog/libnumerixpp

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