windows 下使用 MinGW 编译 boost 并给 clion 配置 cmake Shepard-Wang

1. 下载 boost

2. b2/bjam 参数

  • stage/install:

    stage 表示只生成库(dll 和 lib),install 还会生成包含头文件的 include 目录。推荐使用 stage,因为 install 生成的 include 目录实际就是源码包下的 boost 目录,需要 include 的时候可以直接使用,不需要再次生成,这样可以节省大量的编译时间。

    bjam install --toolset=msvc-14.0 --without-python --prefix="E:\Learning\Boost" link=static runtime-link=shared threading=multi address-model=64
    
  • toolset:

    指定编译器,可选的如 borland、gcc、msvc-14.0(VS2015)等。如果不指定,会自动搜索本地可用的编译器(可查看 ./project-config.jam 文件以确认)。

  • without/with:

    选择不编译/编译哪些库(类似于黑名单/白名单)。--with-python 的含义是仅编译 python,其他的都不编译。反过来,如果用 --without-python,意思就是除了 python, 其他的都编译。with/without 参数可以多次出现,以限定多个库。如果不设置 with/without 参数,默认全部编译,可能需要几个小时的时间!

    需要注意,编译 Boost.python 需要确保本地安装了 Python,并且 python 命令已加入环境变量。

    要查看 Boost 包含的所有库,可使用以下命令:

    b2.exe --show-libraries
    
    //boost::python lib
    bjam stage --toolset=msvc-14.0  --with-python --stagedir="E:\Learning\Boost" link=static threading=multi address-model=64
    
  • stagedir/prefix:

    stage 时使用 stagedir,install 时使用 prefix,表示编译生成文件的路径。推荐给不同的编译环境指定不同的目录,如 Visual Studio 2015 的 x86 应用对应的是 bin/lib32-msvc-14.0,x64 应用对应的是 bin/lib64-msvc-14.0。如果都生成到一个目录下,将没有任何益处,徒增管理难度。如果使用了 install 参数,那么还将在上述指定的目录下生成 include 目录,用于保存头文件。

  • build-dir:

    编译生成的中间文件的路径,默认是 Boost 根目录下的 bin.v2 目录,一般无需设置。

  • build-type: complete 编译所有boost库;默认complete。

    bjam stage --toolset=msvc-14.0 --build-type=complete --stagedir="E:\Learning\Boost" link=static runtime-link=shared threading=multi address-model=64
    
  • link:

    指定生成动态链接库还是静态链接库,取值为 static|shared。生成静态链接库使用 static,生成动态链接库需使用 shared。如不指定,默认使用 static。静态库的缺点是占用空间比较大,优点是程序发布的时候无需附带 Boost 库的 dll,比较整洁。推荐使用静态库的方式编译 Boost.python,这样发布程序的时候就不用 Boost 的 dll 了,并且也多占用不了太多空间。

  • runtime-link:

    指定运行时是动态还是静态链接其他库。同样有 shared 和 static 两种方式。如果不指定,默认是 shared,一般无需设置。

    bjam stage --toolset=msvc-14.0 --build-type=complete --stagedir="E:\Learning\Boost" link=shared runtime-link=shared threading=multi address-model=64
    
  • threading:

    要编译的库是单线程还是多线程,可取值 single|multi。如果不指定,默认是 multi,一般无需设置。

  • variant

    debug|release,编译 debug 版本还是 release 版本。一般与最终发布的程序是 debug 还是 release 版相对应。如果不指定,默认两个都编译,一般无需设置。

  • address-model

    编译成 32 位版本还是 64 位版本,可取值 32|64。如果不指定,默认两个版本都编译。如果是编译 Boost.python,该参数就要与本地安装的 Python 位数相对应,否则编译会出错,因此最好设置一下。

  • debug/release:

    debug版本,release版本,不填就两种版本的库都会编译。

下面以静态库的命名规则为例进行分析:

  1. 静态库以 lib 开头,动态库开头没有 lib
  2. 所有的库都含有 boost 前缀。
  3. Boost 库名称,本例中为 python36
  4. 编译器名称及其版本,vc140 指的是 msvc-14.0,对应 Visual Studio 2015。
  5. mt 代表 threading=multi,没有则代表 threading=single
  6. s 代表 runtime-link=static,没有则代表 runtime-link=shared
  7. gd 代表 debug 版本,没有则代表 release 版本。
  8. 目标位数,x32 代表 32 位,x64 代表 64 位。
  9. Boost 库的版本号,1_68 代表 Boost 1.68 版本。

更多关于 b2 的编译选项参考文章底部的 reference

3. 编译 boost

Folder setup

  1. Extract downloaded boost source, e.g. C:\Program Files\boost_1_59_0.
  2. Create a folder for Boost.Build installation, e.g. C:\Program Files\boost-build.
  3. Create a folder within for building, i.e. C:\Program Files\boost_1_59_0\build.
  4. Create a folder for installation, e.g. C:\Program Files\boost.

GCC setup

  1. Open Command Prompt.
  2. Run g++ --version.
  3. If the output contains g++ version number then GCC should be set up properly to run from command line and you can continue.

Boost.Build setup

  1. Open Command Prompt and navigate to C:\Program Files\boost_1_59_0\tools\build.
  2. Run bootstrap.bat mingw.
  3. Run b2 install --prefix="C:\Program Files\boost-build".
  4. Add C:\Program Files\boost-build\bin to Windows PATH.

boost building

  1. Open Command Prompt and navigate to C:\Program Files\boost_1_59_0.
  2. Run
b2 --build-dir="C:\Program Files\boost_1_59_0\build" --prefix="C:\Program Files\boost" toolset=gcc install

可以再额外指定一下 --address-model 64 不然每个库都会多一份 32 位的版本。

4. 配置 clion 的 Cmakelists.txt

cmake_minimum_required(VERSION 3.20)
project(cpp)

set(CMAKE_CXX_STANDARD 17)

add_executable(cpp main.cpp)

set(Boost_DETAILED_FAILURE_MSG ON)
set(Boost_DEBUG ON)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)

// 根目录为从官网下载的 boost 安装目录 
set(BOOST_ROOT "D:/ThirdParty/boost/boost")
// boost 源文件目录
set(BOOST_INCLUDEDIR ${BOOST_ROOT}/include/boost-1_78)
// boost 库目录
set(BOOST_LIBRARYDIR ${BOOST_ROOT}/lib)
// 下面两行不知道有啥用 == 
set(Boost_COMPILER "-mgw8") # 注意这里是编译后的boost库中包含的字符串,72是MinGW的版本号,根据自己的版本修改,看下自己编译出来的库的名称就知道了

MESSAGE(STATUS "boost root dir: " : ${BOOST_LIBRARYDIR})

// 这块需要你修改 boost 版本,我的版本是 1.78.0
// 需要那些库就在下面加上,库的名字打错了 clion 会提示。也可通过命令行中输入 b2 --show-libraries 查看有那些库
find_package(Boost 1.78.0 REQUIRED COMPONENTS
        atomic
        thread
        type_erasure
        system
        random
        nowide
        locale
        contract
        context
        iostreams
        container
        chrono
        coroutine
        filesystem) # 注意windows下面编译出来的boost库名称中间都有-mgw72,所以需要在前面指定,不然这里提示找不到filesystem
        
add_definitions(${Boost_LIB_DIAGNOSTIC_DEFINITIONS})

include_directories(${BOOST_INCLUDEDIR})

target_link_libraries(cpp ${Boost_LIBRARIES})

完成了这些就可以愉快的使用 boost 了!

reference