如何在自己的仅限标头的库

时间:2018-03-25 08:38:23

标签: 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"和头文件 " test_boost.h&#34 ;. 如果我尝试在头文件" 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})

2 个答案:

答案 0 :(得分:1)

简短回答:你不能

“仅限标题的库”只是一个或多个标题,。这不是一种联系或非常独立的东西。

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

答案 1 :(得分:0)

我认为您可以,但您需要更具体地定义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()

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