【问题标题】:how to include boost headers in own header-only library如何在自己的仅标头库中包含提升标头
【发布时间】:2018-03-26 15:10:52
【问题描述】:

我正在使用 Jetbrains CLion 2017.3 和捆绑的 CMake 版本 3.9.6 和 mingw64 5.0 版本/g++ 7.1。 尽管阅读了“掌握 CMake”(我是 CMake 的新手!),但我在理解基础知识方面有很多困难。自 3 天以来,我一直在寻找一个 CMake 解决方案来创建一个使用 boost (1.66.0 ) 库的自己的仅标头库。

使用我的 CMakeLists.txt 可以找到 boost 库,但我无法在当前源目录的头文件中包含 boost 头文件。

我当前的源目录包含“CMakeLists.txt”和头文件 “test_boost.h”。 如果我尝试在头文件“test_boost.h”中包含 boost 头文件,则找不到 boost 头文件!

我做错了什么?

我的 CMakeLists.txt :

cmake_minimum_required(VERSION 3.9)
project(headerOnlyLib1)

set(CMAKE_CXX_STANDARD 11)

set(ENV{BOOST_ROOT} "C:/dev/boost/mingw/boost_1_66_0/boost")
set(Boost_USE_STATIC_LIBS        ON) # only find static libs
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME    OFF)
find_package(BOOST 1.66 REQUIRED)
IF (Boost_FOUND)
    message(STATUS "BOOST FOUND !")
ELSE()
    message(STATUS "BOOST NOT Found !")
endif()
add_library(headerOnlyLib INTERFACE)
target_include_directories(headerOnlyLib INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(headerOnlyLib INTERFACE ${Boost_INCLUDE_DIRS})
target_link_libraries(headerOnlyLib ${Boost_LIBRARIES})

【问题讨论】:

  • 我觉得应该是set(BOOST_ROOT "C:/dev/boost/mingw/boost_1_66_0")

标签: c++ interface cmake header-only


【解决方案1】:

简答:你不能

“仅标头库”就是这样,一个或多个标头,。它不是链接或真正独立的东西。

如果您的仅标头库具有依赖项,那么您的库的用户具有这些依赖项,需要将它们包含在他们自己的构建中。

【讨论】:

  • 我认为您的回答意味着,在仅标头库的情况下,不涉及二进制文件。我已经明白了。但是CMake中是否不可能在属于自己的仅头文件库的自己的头文件中包含其他库头文件(这里是boost头文件)?
  • @user3664264 不,这不是头文件的真正工作方式。那么你可以在你的头文件上使用预处理器,它将创建一个非常大的头文件,其中包含你包含的所有头文件。这通常不是一个好主意,因为您的代码变得模糊且难以找到。许可也可能有问题。所以真的,将你的库作为一组独立的头文件分发,然后将 Boost 作为其他人需要使用的显式依赖项。
  • 感谢您的澄清。我想现在我已经理解了你之前的答案。
【解决方案2】:

我认为您可以,但您需要更具体地定义您的 boost 依赖项。

例如,CMakeLists.txt 文件 here 依赖于 boost::system 用于 boost::asio。依赖定义如下:

find_package(Boost REQUIRED COMPONENTS system)
if(Boost_FOUND)
  target_include_directories(${PROJECT_NAME} PRIVATE ${Boost_INCLUDE_DIRS})

  # Boost::asio is header only but it requires Boost::system
  target_link_libraries(${PROJECT_NAME} INTERFACE Boost::system)
.
.
.
endif(Boost_FOUND)

在您的情况下,目标是 Boost::boost 用于仅标头依赖项,请参阅 FindBoost。于是相关部分就变成了:

find_package(Boost 1.66 REQUIRED COMPONENTS boost)
IF (Boost_FOUND)
    message(STATUS "BOOST FOUND !")
    target_include_directories(headerOnlyLib INTERFACE ${Boost_INCLUDE_DIRS})
ELSE()
    message(STATUS "BOOST NOT Found !")
endif()

我建议在C++ Now 2017 观看 Daniel Pfeifer 的演讲以了解更多信息。
自从编写了“掌握 CMake”以来,发生了很多变化......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多