cmake 如何在自己Header-only库中包含boost Header

wtlkbnrh  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(155)

我正在使用Jetbrains CLion 2017.3和捆绑的CMake版本3.9.6与mingw 64 5.0版本/g++ 7.1。虽然阅读“掌握CMake”(我是CMake的新手!我在理解基础知识方面有很多困难。自从3天以来,我一直在寻找一个CMake解决方案来创建一个使用Boost(1.66.0)库的自己的Header唯一库。
使用我的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})
brjng4g3

brjng4g31#

简短回答:你不能。
一个“header-only library”就是一个或多个header,only。这不是一个相互联系或独立的东西。
如果你的header-only库有依赖关系,那么你的库的用户也有这些依赖关系,需要在他们自己的构建中包含它们。

myzjeezk

myzjeezk2#

我认为你可以,但是你需要更具体地定义你的boost依赖项。
例如,CMakeLists.txt文件here依赖于boost::asioboost::system。依赖关系定义如下:

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()

我建议观看丹尼尔Pfeifer的谈话在C++ Now 2017的更多信息。
自从《掌握CMake》一书出版以来,发生了很多变化。

bhmjp9jg

bhmjp9jg3#

下面是一个最小的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

相关问题