如何在自己的仅标头库中包含提升标头
how to include boost headers in own header-only library
我正在使用 Jetbrains CLion 2017.3 和捆绑的 CMake 版本 3.9.6 和 mingw64 5.0 版本/g++ 7.1。虽然阅读"掌握CMake"(我是CMake的新手!(,但我很难理解基础知识。从 3 天开始,我正在寻找一个 CMake 解决方案来创建自己的仅标头库,该库使用 boost (1.66.0 ( 库。
使用我的 CMakeLists.txt 可以找到提升库,但我无法在当前源目录中的头文件中包含提升头。
我当前的源代码包含"CMakeLists.txt"和头文件"test_boost.h"。如果我尝试在头文件"test_boost.h"中包含提升头,则找不到提升头!
我做错了什么?
我的 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::asio
的boost::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()
我建议观看Daniel Pfeifer在C++ Now 2017上的演讲以获取更多信息。
自从"掌握CMake"写出来以来,发生了很多变化......
下面是一个包含仅标头的最小 CMake 示例 BOOST 属性树库
-
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
相关文章:
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 没有为自己的结构调用列表推回方法
- 如何正确包含我自己的标头?
- 在wxWidgets的事件中包含我自己的数据的最佳方法是什么?
- 如何在自己的仅标头库中包含提升标头
- 如何将另一个项目中用 C 编写的源代码包含在我自己的项目中,C++在 Visual Studio 中
- G++ 切换为不包含自己的符号函数名称(和调试数据)-
- C 程序要读取包含两个双重值的Excel数据的单列,这些值由逗号分隔并存储在自己的数组中
- MinGW g++ 在自己的包含目录中找不到标头
- Python 可以运行脚本的多个实例,每个实例都包含自己的数据吗?
- 如何将 DirectX 库包含在我自己的静态库(独立库)中
- CMakeLists.txt有两个子项目和自己的CMakeLists.txt只需要创建一个.so库,该库包含所有子项目
- Visual Studio 2013 - 如何在我自己的库中链接/包含其他库
- 无法编译.头文件.包含自己的对象定义
- 使用STL容器,类包含自己的键
- 如何将CodeSynthesis XSD包含到自己的应用程序中
- 类可以包含自己的列表吗?
- 在它自己的源文件中包含头文件
- 是否需要显式地包含其他标头已经包含它们自己的标头?
- 如何为我自己的集合类启用包含大括号的初始值设定项列表