如何正确#include 一个柯南包?
Posted
技术标签:
【中文标题】如何正确#include 一个柯南包?【英文标题】:How do I correctly #include a conan package? 【发布时间】:2021-12-13 12:05:34 【问题描述】:我有以下 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 库:
#include <asio.hpp>
#include <fmt/format.h>
但我没有找到任何关于如何准确#include expected
lib 的信息。我试过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
【问题讨论】:
我建议在 CMakeLists 中打印tl-expected_INCLUDE_DIR
变量的值,并检查其中的内容,作为了解正在发生的事情的第一步。
@drodri 这是C:\Users\*****\.conan\data\tl-expected\20190710\_\_\package\5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9\include\tl\expected.hpp
。就像例如C:\Users\*****\.conan\data\fmt\6.1.2\_\_\package\d057732059ea44a47760900cb5e4855d2bea8714\include\fmt\format.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 方法。您正在使用的 conan cmake 包装器中的自述文件有一些 sn-ps 应该会有所帮助。
基本上,cmake_find_package 生成器将从包中定义 CMake 目标,并在每个目标上定义包含目录、库、编译定义等属性。每当您使用 target_link_libraries(TargetA TargetB) 时,所有传递依赖项都将由 CMake 处理,而无需担心指定包含目录等(您也应该为自己的项目使用目标)。
因此,与 fmt 的链接非常简单(取自 cmake wrapper repo 上的示例):
find_package(fmt)
add_executable(main main.cpp)
target_link_libraries(main fmt::fmt)
如果您想确定包声明的目标,可以检查由柯南创建的 CMake 配置文件。
编辑:刚刚意识到这本身并不能回答您的问题,但这使得更容易理解出了什么问题。在您当前的 CMake 代码中, $x_LIBRARIES 可能只是空的,您没有直接意识到它。对于目标,如果您尝试使用错误的包名称链接,CMake 将引发错误。
【讨论】:
以上是关于如何正确#include 一个柯南包?的主要内容,如果未能解决你的问题,请参考以下文章