【问题标题】:How do I correctly #include a conan package?如何正确#include 一个柯南包?
【发布时间】: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.hpphttps://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

标签: c++ package include conan


【解决方案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 将引发错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多