【问题标题】:How to add a header only library to a project with cmake build system?如何使用 cmake 构建系统将仅标头库添加到项目中?
【发布时间】:2021-05-22 01:05:03
【问题描述】:

我需要修改一个 C++ 项目以使用 Cereal 库。本项目的构建系统基于 CMake。由于 Cereal 是一个只有头文件的库并且也使用 CMake,我希望这是一个非常简单的任务。我尝试使用以下方法编辑CMakeLists.txt

include(ExternalProject)
ExternalProject_Add(cereal
GIT_REPOSITORY    git@github.com:USCiLab/cereal.git
CMAKE_ARGS -DJUST_INSTALL_CEREAL=ON -DSKIP_PORTABILITY_TEST=ON -DBUILD_TESTS=OFF
PREFIX ${CMAKE_INSTALL_PREFIX})

但不知何故cmake 试图在/usr/local 下安装cereal。我感谢任何可以为我指明正确方向的帮助。

【问题讨论】:

  • 您是否尝试在您的 CMake 文件中更改此部分:-DJUST_INSTALL_CEREAL=ON
  • 感谢您的建议。事实上,我什至不需要CMAKE_ARGS,因为不需要配置或安装谷物。
  • 如果 FetchContent 是仅标头库,而不是 ExternalProject,则需要 FetchContent
  • 感谢@AlexReinking,我试过FetchContent_Declare( cereal GIT_REPOSITORY git@github.com:USCiLab/cereal.git ) FetchContent_MakeAvailable(cereal),它可以工作,但我仍然需要添加include_directories( ${CMAKE_BINARY_DIR}/_deps/cereal-src/include),否则构建找不到谷物。
  • 我应该添加更多信息。 Cereal 确实是一个可选依赖项,实际代码使用宏 __has_include 检查谷物。如果我没有 include_directories 麦片,该宏将返回 false。

标签: c++ installation cmake cereal header-only


【解决方案1】:

正确的方法是始终链接到库:

target_link_libraries(your-executable PUBLIC cereal::cereal)

由于这个库定义了一个目标,您可以直接使用它,以便将包含目录自动设置为您的目标。

【讨论】:

  • 有了我发布的答案,我不需要安装麦片。我想使用target_link_libraries,我需要安装谷物,否则使用target "cereal::cereal" not found 构建失败。我在这里错过了什么吗?为什么您认为我发布的答案不是正确的方法?
  • 因为谷物可能需要设置编译器标志、定义等才能使用。这是通过链接到目标自动处理的,而不是使用include_directories(无论如何都不应该在新代码中使用)
  • 您也无需安装它即可使用target_link_libraries。只需切换到 FetchContent 而不是 ExternalProject。
  • @AlexReinking 感谢您提供的信息。我可以了解为什么不应该使用include_directories 吗?从文档中我只看到应该首选target_include_directories(),但没有更多细节。
  • @Armut 你不需要安装吗?您可以简单地add_directory 并使用目标。或者,您可以在项目或构建目录中设置安装前缀,然后从那里执行find_package。这不是不使用目标的好借口。
【解决方案2】:

我不确定这是否是最好的做法,但以下方法可行。诀窍是不要安装任何东西并正确设置包含目录。

include(ExternalProject)
ExternalProject_Add(cereal
  GIT_REPOSITORY    git@github.com:USCiLab/cereal.git
  PREFIX cereal
  SOURCE_DIR "${CMAKE_BINARY_DIR}/third-party/cereal"
  CONFIGURE_COMMAND ""
  BUILD_COMMAND ""
  INSTALL_COMMAND ""
)
include_directories(
    ${CMAKE_BINARY_DIR}/third-party/cereal/include) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多