如何在自己的仅标头库中包含 boost 标头

问题描述 投票:0回答:3

我正在使用 Jetbrains CLion 2017.3 和捆绑的 CMake 版本 3.9.6 以及 mingw64 5.0 版本/g++ 7.1。 尽管阅读了“掌握 CMake”(我是 CMake 的新手!),但我在理解基础知识时遇到了很多困难。三天以来,我一直在寻找 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})
c++ interface cmake header-only
3个回答
1
投票

简短回答:你不能

“仅标头库”就是一个或多个标头,only。它不是相互关联的或真正独立的东西。

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


0
投票

我认为你可以,但你需要更具体地定义你的

boost
依赖项。

例如,

CMakeLists.txt
文件此处 依赖于
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()

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


0
投票

这是一个最小的 CMake 示例,仅包含标头 BOOST PropertyTree

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
set(PROJECT_NAME test)

project(${PROJECT_NAME})

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Boost 1.82 REQUIRED)
include_directories("${Boost_INCLUDE_DIRS}")
add_executable(${PROJECT_NAME} "src/main.cpp")
  • src/main.cpp
#include <boost/property_tree/ptree.hpp>

int main() {
  boost::property_tree::ptree root;
  root.put("A", "B");
}
  • 编译
mkdir build
cd build
cmake ..
make
© www.soinside.com 2019 - 2024. All rights reserved.