我有以下 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:没有这样的文件或目录
最佳答案
我没有使用 conan_cmake_configure 包装器,但使用 targets 是推荐的现代 CMake 方法。您正在使用的 conan cmake 包装器的自述文件中有一些应该有用的片段。
基本上,cmake_find_package 生成器将从包中定义 CMake 目标,并在每个目标上定义属性,例如包含目录、库、编译定义等。每当您使用 target_link_libraries(TargetA TargetB) 时,所有传递依赖项都将由 CMake 处理,而无需担心指定包含目录等(您也应该为自己的项目使用目标)。
因此,与 fmt 的链接非常简单(取自 cmake 包装器存储库上的示例):
find_package(fmt)
add_executable(main main.cpp)
target_link_libraries(main fmt::fmt)
如果您想确定包声明的目标,可以检查 conan 创建的 CMake 配置文件。
编辑:刚刚意识到这本身并不能回答您的问题,但这使得更容易理解出了什么问题。在您当前的 CMake 代码中,${x_LIBRARIES} 可能只是空的,您无法直接意识到它。对于目标,如果您尝试链接错误的包名称,CMake 将抛出错误。
关于c++ - 如何正确#include conan 包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69751515/