如何从 github 安装 C++20 范围库

How to install the C++20 range library from github

我想用 range-v3 library in my project, but i don't understand how. The installation description 表示如下:

This library is header-only. You can get the source code from the range-v3 repository on github. To compile with Range-v3, just #include the individual headers you want.

这是否意味着我可以复制并粘贴所需的头文件并将文件路径添加到我的 CMake 文件中?我有点困惑,因为我从来没有包含第三方库。

注意:请参阅 hythis' 答案以获得更好的解决方案。


Does that mean I can copy and paste the needed header files and add the filepath to my CMake file?

基本上是的。先是git clone<path_to_range_v3>。然后将这些行包含到 CMakeLists.txt:

add_library(range_v3 INTERFACE IMPORTED)
set_target_properties(range_v3 PROPERTIES 
    INTERFACE_INCLUDE_DIRECTORIES <path_to_range_v3>/include)

target_link_libraries(your_target PUBLIC range_v3)

我不确定 Evg 为什么建议他们这样做,我什至不认为在 2019 年你被迫使用 ranges-v3 (see here, the file existed way before hand) 创建你自己的 CMake 界面。无论如何,不​​要使用 Evg 的解决方案,ranges-v3 是一个 good header only library,并且为了 header only library 是好的 它必须提供 CMake 集成

Header只有库并不意味着作者不提供CMake支持,甚至避免使用CMake。糟糕的作者会这样做,因为您可能首先不得不问这个问题。

要与 Ranges V3 正确集成,请使用包管理器(尽管一些包管理器会根据其自定义 CMake 文件的配置方式搞砸流程),例如 Conan 或 vcpkg 并与各自的 CMake 解决方案集成,或添加项目作为 git 子模块(虽然你也可以 git 克隆它)然后在你的 CMakeLists.txt:

add_subdirectory([path to submodules]/range-v3)
...
target_link_libraries(my_target [SCOPE] range-v3::range-v3)

如果作者不详细说明如何在 CMake 项目中使用他们的项目,就很难找出库的实际目标,而且我不会责怪任何制作 SO 的人 post关于它,很痛苦。

一般如果项目有一个CMakeLists.txt文件,它可能有static-library/sub_directory cmake集成,但是一些库只有安装目标,因此无法使用在不编辑它们的 CMakeLists.txt

的情况下融入您的源代码时

要检查是否是这种情况,或者您是否真的可以使用这些目标,如果您找不到任何关于如何使用该库的 CMake 文档(我找不到),请执行以下操作:

  • 查看 CMakeLists.txt 文件
  • 通常以project_name::project_name的形式查找项目别名。这就是我找到 range-v3 的项目别名的方式。
  • 如果找不到别名(通过搜索 ::),找到库的实际目标名称(并尝试直接使用它),但有时它不会导出(隐藏在子目录中)从顶部的 cmake 文件)。例如,OpenCV 不使用 ::,而是每个组件目标都标有 opencv_[组件名称] 但仍然导出。

如果项目没有被配置为正确地用作子模块,并且打算用作静态库,请向给定的存储库提交问题或 PR,这是一个错误。