windows环境cmake引用boost库

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称。
Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。

boost库在linux环境的使用很简单,特别是ubuntu和cenntos这种分发版,软件仓库有专门的deb或rpm包,这里linux环境我们只提一句,不细讲了。


一、下载源代码

直接到官方网站去下载源代码就行了,选择你需要的版本即可。
Boost官网
这个需要点击Download找到需要的版本,官网不仅有Boost的源代码,还有Document和Example可以参考。如果你不想麻烦去找,下面给一个版本集合,选择合适的即可。
版本集合
在这里插入图片描述
选择需要的版本,比如1.71.0(Ubuntu-20.04的默认版本)
在这里插入图片描述

点source进去,找到zip或tar都行,建议windows环境下载zip最佳。
在这里插入图片描述

.json里面是验证串,你首先必须保证下载下来的zip是完整的。

二、编译前准备

这里我们的方式是通过gcc编译,然后通过cmake直接引用;还有一种方法是Virtual Studio 引用(不是这篇文章讲的),由于两种方法差别比较大,所以我只说我的环境。

1.操作系统

我使用的是Windows11,理论上Windows10也是可以的,但是我手上没有Win10环境,希望大家自行测试。Windows7应该也可以,不过身边完全找不到Win7环境了,我也不想装虚拟机什么的,希望大家最大限度和我的环境保持一致吧。

2.gcc环境

我安装的Clion-2022.2.4环境里面自带这个工具链,大家可以效仿我安装Clion,然后配置下环境变量就行了。当然自己安装环境也是可以的,mingw和cygwin都行;这里就不说怎么安装了,不会的搜索下就行了。
下面是我的环境截图:
在这里插入图片描述
这个是安装Clion内置的mingw环境,只需要配置个环境变量就行了。
在这里插入图片描述

3.建立安装目录

最好提前准备个目标目录,用来存放编译好的库。
D:\Work\C++_libs\boost_1_71_0\boost_build

三、开始编译

1.解压源代码

解压源代码到一个不小于5G的存储空间用来存放编译产生的中间文件。这里以1.71.0版本为例:
在这里插入图片描述
这是没编译前的目录结构,打开一个命令行进入到这个目录。我使用的是Terminal,你可以使用PowerShell,但我不保证CMD也行。

2.开始编译

先进到Boost的根目录(上面展示的那个),依次执行下面的命令:

cd ./tools/build
./bootstrap.bat
#等待执行完成

如果没有报错的话(一般不会报错),目录下会生成一个b2.exe程序,官方的说法是加入到环境变量里面去,这里我们不加环境变量,直接使用全路径导航。
记得上面我定义的安装目录吗?D:\Work\C++_libs\boost_1_71_0\boost_build,这个是我的目录,你需要自己创建一个目录,最好不要有空格
这个时候你退到Boost的根目录(不是tools/build),完成之后执行下面的命令:

#--prefix=<你的安装目录>
.\tools\build\b2.exe --prefix=D:\Work\C++_libs\boost_1_65_1\boost_build toolset=gcc install

很好,编译需要十来分钟吧,主要取决于你的配置

四、开始使用

如果一切顺利(我基本没报过错),你的库就被安装到指定的目录了。你的目录结构大致相当于下面的结构:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我这里用的静态库,你也可以编译动态库,根据个人喜好吧。这都不是重点,重点是怎么在Clion里面引用Boost。这个跟在Ubuntu里面引用有一些差别,准确来说没有Ubuntu直接安装的方便。

1.Clion创建项目

必须使用C++11以上的版本,这里就用C++11吧。请看下面的配置:

cmake_minimum_required(VERSION 3.23)
project(Class28)

set(CMAKE_CXX_STANDARD 11)
set(BOOST_ROOT "D:\\Work\\C++_libs\\boost_1_71_0")    # 指定Boost库的根目录
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(Boost_ARCHITECTURE "-x64")    # 指定库架构为x64
find_package(Boost COMPONENTS atomic REQUIRED)    # 查找Boost库

include_directories(${Boost_INCLUDE_DIRS})    # 包含Boost库的头文件目录

MESSAGE(STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}")
MESSAGE(STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}")
MESSAGE(STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}")

add_executable(Class28 main.cpp)
target_link_libraries(Class28 ${Boost_LIBRARIES})    # 链接Boost库

我用的编译环境是x86_64,所以我指定了Boost_ARCHITECTURE ,如果你是x86的环境,理论上你编译出来的库应该是x86的,而不是像我一样有两个版本(x86和x86_64)。

x86_64向下兼容x86,而x86不能运行x86_64编译出来的软件,这一点很重要!

如果cmake成功了,你应该可以看到跟我一样的正确提示。
在这里插入图片描述

2.Boost版本差异

这里多提一句,Boost这个库对C++来讲很重要,它本身也是在往前面发展的。不同版本的库可能组件是不一样的,比如我用的1.82.0里面有json组件,然而1.71.0里面没有这个组件,直接引用会报错。这种问题还有很多,你可以参考官方文档看下组件的情况。

这里我给出一种比较笨的解决方法:就拿json这个组件来说,如果你直接在CMakeLists.txt里面引用,cmake构建的时候会直接报错,导致不能进入下一步,也就是编译。

find_package(Boost COMPONENTS json REQUIRED)    # 查找Boost库

在这里插入图片描述
这个错误的意思是找不到这个组件,我们去库里面看看。对比下1.71.0和1.82.0发现,1.71.0确实没有这个组件。那么怎么办呢?方法其实很多种,最简单的就是使用第三方的jsoncpp,我就是这么使用的。

不要过度依赖boost

3.Boost版本适配

有时候程序员会有一个避不开的问题,或许你要用boost的新版本,却又发现有些东西不适配旧代码,这个办法也是有的。当然目前除了组件缺失,我没有遇到这种情况。

#if BOOST_VERSION >= 108200
    cout << "1.82.0" << endl;
#include <boost/json.hpp>
#elif BOOST_VERSION >= 107100
    cout << "1.71.0" << endl;
#elif BOOST_VERSION >= 106510
    cout<<"1.65.1"<<endl;
#endif

BOOST_VERSION 这个宏在<boost/version.hpp>里面,每个boost版本必带。主要有两个字段:
在这里插入图片描述
通过判断BOOST_VERSION 就可以做版本适配了。


总结

1、整个过程没有遇到什么错误,一气呵成。
2、如果有疑问,或者报错可以评论,我看到后会帮助你解决的。

猜你喜欢

转载自blog.csdn.net/jiexijihe945/article/details/131303313