#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 и вы его найдете.