#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 выдаст ошибку, если вы пытаетесь связать с неправильным именем пакета.