Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在自己的仅页眉库中包含boost页眉_C++_Interface_Cmake_Header Only - Fatal编程技术网

C++ 如何在自己的仅页眉库中包含boost页眉

C++ 如何在自己的仅页眉库中包含boost页眉,c++,interface,cmake,header-only,C++,Interface,Cmake,Header Only,我使用的是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”和头文件 “t

我使用的是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头文件

我做错了什么

My 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})
简单回答:你不能

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


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

我认为您可以,但您需要更具体地定义您的
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
,对于仅标题依赖项,请参阅。因此,相关部分变成:

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在的演讲以了解更多信息。

自从“Mastering CMake”被编写以来,已经发生了很多变化。

我认为应该设置它(BOOST\u ROOT“C:/dev/BOOST/mingw/BOOST\u 1\u 66\u 0”)我认为您的答案意味着,在只使用头库的情况下,不涉及二进制文件。我已经明白了。但是,在CMake中,是否不可能将其他库头文件(此处为boost头文件)包含在属于自己的仅头文件库的头文件中?@user3664264不,头文件的工作原理并非如此。您可以在头文件上使用预处理器,这将创建一个非常大的头文件,其中包含所有包含的头文件。这通常不是一个好主意,因为您的代码变得模糊,很难找到。这也可能是许可的问题。所以,实际上,将您的库作为一组独立的头文件分发,然后将Boost作为其他人需要使用的显式依赖项。感谢您的澄清。我想现在我已经明白你先前的回答了。