zoukankan      html  css  js  c++  java
  • windows编译boost

    1. https://www.boost.org 下载boost源码 boost_1_73_0.zip解压。

    2.准备编译前的配置,打开vs2017 x86 CMD工具,进入目录boost_1_73_0,执行bootstrap.bat,等待初始化完毕,

    会生成b2.exe和bjam.exe两个程序,所有编译工作都是通过b2.exe或bjam.exe完成,可以通过help查看参数,b2.exe方式比较新。
    指令格式大概如下:
    b2 install --toolset=msvc-14.1 --prefix="D:Boostvc141" link=static runtime-link=shared threading=multi debug release

    (1)stage/install:
    stage表示只生成库(dll和lib),install还会生成包含头文件的include目录和CMake文件夹。

    (2)toolset:
    指定编译器,可选的如minGW、msvc等。
    vs2017 : msvc-14.1,vs2015 : msvc-14.0,

    (3)without/with:
    选择不编译/编译哪些库。因为python、mpi等库我都用不着,所以排除之。还有wave、graph、math、regex、test、program_options、serialization、signals这几个库编出的静态lib都非常大,所以不需要的也可以without掉。这可以根据各人需要进行选择,默认是全部编译。但是需要注意,如果选择编译python的话,是需要python语言支持的,应该到python官方主页下载安装。

    查看boost包含库的命令是b2 --show-libraries。

    4)stagedir/prefix:
    stage时使用stagedir,install时使用prefix,表示编译生成文件的路径。推荐给不同的IDE指定不同的目录,32位、64位要区分开,不过IDE也有区分。

    (5)build-dir:
    编译生成的中间文件的路径。这个本人这里没用到,默认就在根目录下,目录名为bin.v2,等编译完成后可将这个目录全部删除(没用了),所以不需要去设置。

    (6)link:
    生成动态链接库/静态链接库。生成动态链接库需使用shared方式,生成静态链接库需使用static方式。一般boost库可能都是以static方式编译,因为最终发布程序带着boost的dll感觉会比较累赘。

    (7)runtime-link:
    动态/静态链接C/C++运行时库。同样有shared和static两种方式,这样runtime-link和link一共可以产生4种组合方式,各人可以根据自己的需要选择编译。

    (8)architecture
    表示架构,也就是你的CPU架构,所以是x86

    (9)address-model
    地址长度,32表示编译32位的库文件,64表示编译64位的库文件

    (8)threading:
    单/多线程编译。一般都写多线程程序,当然要指定multi方式了;如果需要编写单线程程序,那么还需要编译单线程库,可以使用single方式。

    (9)debug/release:
    编译debug/release版本。一般都是程序的debug版本对应库的debug版本,所以两个都编译。
    
    编译boost
    编译boost的命令比较复杂,尤其是 link, runtime-link 这两个选项的功能分不太清楚,他们共有4种相互组合,这些相互组合各有什么含义呢?
    所以首先做个实验,仅编译date_time库,观察一下这两个选项的作用。
    
    第一种;
    b2 stage --toolset=msvc-12.0 --with-date_time --stagedir="E:eCodeoost_1_56_0invc12" link=static runtime-link=static threading=multi debug release
    第二种;
    b2 stage --toolset=msvc-12.0 --with-date_time --stagedir="E:eCodeoost_1_56_0invc12" link=static runtime-link=shared threading=multi debug release
    第三种;
    b2 stage --toolset=msvc-12.0 --with-date_time --stagedir="E:eCodeoost_1_56_0invc12" link=shared runtime-link=shared threading=multi debug release
    第四种:
    b2 stage --toolset=msvc-12.0 --with-date_time --stagedir="E:eCodeoost_1_56_0invc12" link=shared runtime-link=static threading=multi debug release
    第五种:
    b2 stage --toolset=msvc-12.0 --with-date_time --stagedir="E:eCodeoost_1_56_0invc12_2" (默认,为避免将前面的结果覆盖,配置另一目录vc12_2存放)
    第五种:
    b2 stage --toolset=msvc-12.0 --with-date_time --stagedir="E:eCodeoost_1_56_0invc12_2" --build-type=complete(为避免将前面的结果覆盖,配置另一目录vc12_3存放)

     

    说明:

    (1)--build-type=complete时link,runtime-link3种组合下debug, release的多线程版本都生成出来了除此之外还生成了link=static,runtime-link=static的debug, release的单线程版本

    (2)Boost库的使用方式link决定了生成的库的格式:lib(静态链接库-static), dll(动态链接库-share)

      当link是static时,生成的静态库: libboost_*****.lib

      当link是share时,生成的动态链接库:boost_****.dll

    (3)Boost库的编译中runtime-link,决定了生成库与C/C++库的连接方式

      当runtime-link是static使: 生成的库文件名有 s

      当runtime-link是share使: 生成的库文件名没有s

    (4)link以及与runtime-link缺省的设置是:

        link是静态的(便于整合到应用中,避免单独移动boost的相关动态连接库)

        runtime-link是share的,这样可以动态调用c/C++运行时库,方便

    (5)degug版本的库名称: 含有gd

      release版本中的库名称;不含有gd

    (6)threading,设置mutl 多线程的库,则库名称包含:mutl

      如果是单线程,则没有mutl

    (7)我们还可以分析一下 boost 库的命名特点

    • 以“lib”开头的是“link=static”版本(静态链接库版本,没有dll),而直接以“boost”开头的是“link=shared”版本(动态链接库版本,包含lib和dll)。
    • 所有的库都含有"boost"前缀。
    • 紧随其后的是boost库名称(比如date_time库)。
    • 然后是编译器的版本,与库名称之间以"-"而不是下划线"_"分隔(比如 -vc120)。
    • 有“mt”的为“threading=multi”版本,没有的则是“threading=single”版本。
    • 有“s”的为“runtime-link=static”版本,没有的则是“runtime-link=shared”版本。
    • 有“gd”的为debug版本,没有的则是release版本。
    • 所有的库都含有boost库的版本号结尾(比如1_56,其中的"."以下划线"_"代替)

    在IDE中关联Boost库,我的项目都是采用CMake方式创建的
    QTCreator 中点击左侧的项目菜单,在CMake参数表格中添加
    Boost_INCLUDE_DiR 设置为 "boost_1_70_0includeoost-170"
    Boost_DIR 设置成 "boost_1_70_0libcmakeBoost-1.70.0"
    点击 apply Configuration Changes,编译参数。

    MSVC 中,先使用CMake-GUI工具打开CMake项目,设置参数同样,
    点击Configure,编译参数。

    CMakeLists.txt 包括

    find_package(Boost 1.70.0 REQUIRED)
    if(Boost_FOUND)
        set(Boost_LIBRARY_DIRS D:/ScanSource/download/Boost/vc141_64/lib)
        message(Boost_INCLUDE_DIRS " ${Boost_INCLUDE_DIRS}")
        message(Boost_LIBRARY_DIRS " ${Boost_LIBRARY_DIRS}")
    endif()
    
    include_directories(${Boost_INCLUDE_DIRS})
    link_directories(${Boost_LIBRARY_DIRS})

    注意事项
    1、CMake网站有引用Boost的约定参数说明,引用过程中出错可以参考文档说明。
    2、注意使用的Boost的版本,路径是否与项目一致,出现错误一般都是没有找到头文件路径、没有找到Lib路径、使用的32位与64位版本错误,使用的动态库、静态库版本错误。
    通过生成的文件名可以区分,了解“mt”“s”"gd" ,“lib”“dll”的意思,如果一切顺利就可以放心使用了。

    转自:https://zhuanlan.zhihu.com/p/85806857

  • 相关阅读:
    理解C++类 this 指针的例子
    C++ const修饰符
    C++遍历循环多维数组
    C++ begin()和end()
    动态规划——最大子串和
    matlab 和 origin作图去除白边,字体调节
    求字符串中的某个子串重复次数
    mysql的 join联合查询的通俗解释
    java正则表达式常用实例——借鉴思路
    注册表的简单使用
  • 原文地址:https://www.cnblogs.com/zebra-bin/p/13228650.html
Copyright © 2011-2022 走看看