如何正确#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 一个柯南包?的主要内容,如果未能解决你的问题,请参考以下文章

如何在openSUSE Tumbleweed上安装柯南包管理器最正确?

用GoogleTest库编译程序失败,由柯南安装。

如何不在我的柯南包中包含源文件?

柯南无法从新的构建服务器中找到包 ID

连接柯南包和普通Qt目录

是否可以在柯南包管理器中使用 github 分支?