Как мне правильно #включить пакет conan?

#c #package #include #conan

Вопрос:

У меня следующая конфигурация cmake.

   conan_cmake_configure(REQUIRES
                        catch2/2.13.7
                        fmt/6.1.2
                        termcolor/2.0.0
                        date/3.0.1
                        asio/1.20.0
                        tl-expected/20190710
                        GENERATORS cmake_find_package)

...
...
...

find_package(fmt REQUIRED)
include_directories(${fmt_INCLUDE_DIR})
link_libraries(${fmt_LIBRARIES})

find_package(termcolor REQUIRED)
include_directories(${termcolor_INCLUDE_DIR})
link_libraries(${termcolor_LIBRARIES})

find_package(date REQUIRED)
include_directories(${date_INCLUDE_DIR})
link_libraries(${date_LIBRARIES})

find_package(asio REQUIRED)
include_directories(${asio_INCLUDE_DIR})
link_libraries(${asio_LIBRARIES})

find_package(tl-expected REQUIRED)
include_directories(${tl-expected_INCLUDE_DIR})
link_libraries(${tl-expected_LIBRARIES})

 

Я могу #включить библиотеки следующим образом:

 #include <asio.hpp>
#include <fmt/format.h>

 

но я не нахожу никакой информации о том, как именно #включить expected библиотеку. Я пробовал expected.hpp и пример из https://github.com/hannahwhy/conan-tl-expected/blob/stable/1.0.1/test_package/example.cpp

Это fatal error C1083: No such file or directory

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

1. Я бы рекомендовал распечатать значения tl-expected_INCLUDE_DIR переменной в ваших CMakeLists и проверить, что там есть, в качестве первого шага, чтобы понять, что происходит.

2. @drodri Это C:Users*****.conandatatl-expected20190710__package5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9includetlexpected.hpp . Как, например C:Users*****.conandatafmt6.1.2__packaged057732059ea44a47760900cb5e4855d2bea8714includefmtformat.h

Ответ №1:

Спасибо за ваши советы. Ответ на самом деле прост (как это часто бывает).

cmake преобразуется - в _ при создании переменных include_directories и link_libaries . Итак, это исправлено:

 find_package(tl-expected REQUIRED)
include_directories(${tl_expected_INCLUDE_DIR})
link_libraries(${tl_expected_LIBRARIES})
 

Ответ №2:

Я не использовал оболочку conan_cmake_configure, но использование targets является рекомендуемым современным подходом CMake. В readme из используемой вами оболочки conan cmake есть несколько фрагментов, которые должны быть полезными.

По сути, генератор cmake_find_package будет определять цели CMake из пакетов и определять такие свойства, как включение каталогов, библиотек, определение компиляции и т. Д. Для каждой цели. Всякий раз, когда вы используете target_link_libraries(TargetA TargetB), все транзитивные зависимости будут обрабатываться CMake, не беспокоясь о том, чтобы указывать включаемые каталоги и тому подобное (вы также должны использовать targets для своего собственного проекта).

Итак, связывание с fmt очень просто (взято из примеров в репозитории-оболочке cmake):

 find_package(fmt)

add_executable(main main.cpp)
target_link_libraries(main fmt::fmt)
 

Вы можете проверить файлы конфигурации CMake, созданные conan, если хотите быть уверенными в целях, которые объявлены пакетом.

Редактировать: только что понял, что это не отвечает на ваш вопрос как таковой, но это значительно упрощает понимание того, что пошло не так. В вашем текущем коде CMake ${x_LIBRARIES} может быть просто пустым, и вы не знаете об этом напрямую. С targets CMake выдаст ошибку, если вы пытаетесь связать с неправильным именем пакета.