Как интегрировать библиотеку C , если ее пакет не назван

#c #cmake #build

#c #cmake #строить

Вопрос:

Вопрос новичка C и CMake о том, как интегрировать стороннюю библиотеку в мой собственный код. Я пытаюсь добавить метрики Datadog в приложение C . В официально одобренной библиотеке не указано, как она может быть интегрирована. Я полагаю, это должно подсказать мне, как импортировать его следующим образом:

 find_package(<PACKAGE> REQUIRED)
add_executable(foobar src/main.cpp)
target_include_directories(foobar PUBLIC ${<PACKAGE_DIRECTORIES>})
target_link_libraries(foobar ${<PACKAGE_LIBRARIES>})
 

Это мое понимание того, как интегрировать стороннюю библиотеку (разве вы не хотите, чтобы в C был «pip»?). Но имена в <> не указаны в README. Мне, конечно, не нужно делать это таким образом, пока я могу использовать CMake. Любая помощь приветствуется!

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

1. Просто поместите папку в дерево исходных текстов, используйте add_subdirectory и include_directories , а затем сопоставьте ваш исполняемый файл с выводом. Нет необходимости find_package , если только вы не установили эту библиотеку с помощью менеджера пакетов

2. CMakeLists.txt Файл, предоставляемый библиотекой, сильно отсутствует. Также, взглянув на заголовки, вы увидите, что невозможно будет использовать build a usable .dll (по крайней мере, нет ничего, что можно было бы использовать для вставки инструкций dllimport / export . Предполагая, что вы знаете, где установлена библиотека, я бы рекомендовал добавить импортированную библиотеку через add_library и установить IMPORTED_LOCATION целевое свойство. В дополнение к этому включить каталог target_include_directories с помощью INTERFACE «видимости». Использование include_directories на самом деле не очень хорошая идея, применяется ко всем целям в каталоге.

Ответ №1:

Простое решение — получить эту библиотеку напрямую и сделать add_subdirectory это . Но для этого требуется cmake >= 3.11.

Создайте каталог cmake и файл cmake/cpp-datadogstatsd.cmake

cpp-datadogstatsd.cmake :

 FetchContent_Declare(
        datadogstatsd
        GIT_REPOSITORY https://github.com/BoardiesITSolutions/cpp-datadogstatsd
        # try v1.1.0.5 if this does not work
        GIT_TAG        1.1.0.5
)

FetchContent_GetProperties(datadogstatsd)
if(NOT datadogstatsd_POPULATED)
    message(STATUS "Downloading datadogstatsd...")

    FetchContent_Populate(datadogstatsd)
    add_subdirectory(${datadogstatsd_SOURCE_DIR} ${datadogstatsd_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()

 

Затем включите этот файл cmake и ссылку DataDogStatsD_static на вашу библиотеку / exe:

 include(cmake/cpp-datadogstatsd.cmake)

add_executable(test main.cpp)
target_link_libraries(test DataDogStatsD_static)
 

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

1. Спасибо тебе, @warchantua! В этом есть смысл. Интересно, DataDogStatsD_static создается ли это автоматически путем включения «cmake /cpp-datadogstatsd.cmake»?

2. Он создан автором этой библиотеки. Попробуйте прочитать их корень CMakeLists.txt и вы его найдете.