• boost安装


    虽然很多Boost组件都只有头文件,不需要编译,但是有些Boost组件,如program_options、regex等还是需要编译生成库的。考虑到目前的程序需要用到program_options、regex等组件,还可能用到filesystem组件,所以还是决定先把Boost编译一下。

      习惯性的找Boost某个组件或者整个Boost的*.dsp或者*.sln文件,没找到。于是只好老老实实地去看文档,Getting Started on Windows一节有说,需要获得bjam。得,先编译bjam吧。好在bjam的源码也在Boost源码包中,不需要特别去下载。

      进入tools/jam目录(习惯用/来表示目录分隔,写起来方便),一眼就看见了,build_dist.bat,运行它当然是可以得到bjam.exe的,但是貌似这个批处理还干了些其它的事情,所以还是根据各方面的资料,再进入stage目录,找到build.bat来运行。这个批处理还算聪明,居然能自己配置VC的相关路径。

      跑tools/jam/stage/build.bat没遇到啥问题。结果在stage下面产生了bin.ntx86和boost-jam-3.1.17-1-ntx86等目录——如果jam版本不一样,举一反三。这两个目录下都有bjam.exe,一样的,不过看起来,boost-jam-3.1.17-1-ntx86目录更像是发行目录,因为这里面只有bjam.exe和license说明。我本来也不准备要改PATH环境,所以随便找一个bjam.exe拷贝到boost主目录下去,准备编译。

      有了bjam之后要编译boost就简单了,直接到命令行下运行bjam就OK(貌似不到命令行下直接双击运行也行)。不过这样据说会编译全部boost库和N种配置,费时还浪费磁盘空间。我只会用到上面说的三个组件,只编译那三个组件,每个两种配置(debug一种,release一种)就好。为了省时省空间,就费点力自己写几个命令吧。运行个bjam --help,看看命令行是咋个写的:

    Usage:
      bjam [options] [properties] [install|stage]
    

      命令行道是简单,就是选项+属性+目标。目标就两个install和stage,其中install根据指定的安装目录,把头文件和编译出来的.lib都拷贝过去——浪费空间,就选stage吧,默认就是,都不用特别指定了。

      选项用默认的也行,有几个属性可能需要修改:

      1. --with-<library>,这个选项指定需要编译的组件。如果不指定,就是编译全部Boost库。其中<library>就是Boost主目录下libs目录中的子目录名。比如编译正则表达式库这个选项设置为:--with-regex。

      2. --stagedir=<dir>,这个选项指定编译的结果拷贝到哪里。bjam会把编译生成的*.lib和*.dll拷贝到指定目录下的lib目录。默认是Boost主目录下的stage目录。其实,就用默认值挺好的。

      3. --build-type=complate,意思是尝试所有可能的组合,比如多线程静态,多线程DLL等。在使用--with参数指定了组件的情况下,使用这个选项可以少些配置。不过编译出来的东西还是很可观,一个组件的这些库产生出来至少要占几十M的空间。所以,我宁愿不用这个选项,配置下面要提到的编译属性来选择性的编辑Boost组件。

      属性(properties)有这么一些:

      toolset=toolset
      variant=debug|release
      link=static|shared
      threading=single|multi
      runtime-link=static|shared
    

      toolset指定编译工具集,可用的工具集在文档中有个列表。在Windows下一般是用VC编译,对应的工具集是msvc。如果不指定toolset,默认也是用的msvc。

      variant指定编译的是debug版本还是release版本。分别用于VC项目中的Debug配置和Release配置。

      link是指编译出来的Boost组件库是静态还是动态。静态Boost组件库会直接链接到你的项目中,而动态组件库会产生一个相应的.dll文件,运行时需要这个.dll文件的支持(配置在PATH中或放置在应用程序所在目录)。我觉得犯不着随一个应用程序发布一大堆动态库,而且你的.exe就算编译成10M,在如今的磁盘空间和网速下,都是可以接受的,所以一般都配置成static了。

      threading,指定连接单线程还是多线程的C++运行时库。

      runtime-link,指定C++运行时库是用静态的还是动态的。

      这些属性中,variant、threading和runtime-link是可以根据VC项目的“运行库”配置(在项目属性→C/C++→代码生成→运行库)来决定的。比如下表:

    运行库设置对应的Boost编译属性配置
    运行库设置variantthreadingruntime-link
    多线程(/MT) release multi static
    多线程调试(/MTd) debug multi shared
    多线程DLL(/MD) release multi static
    多线程调试DLL(/MDd) debug multi shared

      因为我的VC 2008 Express没有单线程的相关配置,所以只列了多线程的项出来。如果要为单线程的“运行库”配置Boost编译属性,只需要相应地把threading的值改为single就行了。

      总的来说,编译命令也不是很麻烦。比如,编译正则表达式的“多线程调试DLL”和“多线程”两种配置,就用下面两个命令来分别完成:

    D:/boost_1_39_0>bjam toolset=msvc link=static threading=multi variant=debug runtime-link=shared --with-regex

    D:/boost_1_39_0>bjam toolset=msvc link=static threading=multi variant=release runtime-link=static --with-regex

      编译Boost用的是非常规方法,所以写这篇博客备忘。

  • 相关阅读:
    SpringBoot中使用Netty实现TCP通讯,服务器主动向客户端发送数据
    Sort operation used more than the maximum 33554432 bytes of RAM
    linux报错bash: ./xx.sh: Permission denied
    mangoDB操作指令
    nginx 强制https
    60ES10数组方法扩展flat与flatMap
    63ES11Promise_allSettled方法
    67ES11BigInt类型
    62ES11私有属性
    66ES11动态import
  • 原文地址:https://www.cnblogs.com/oracleloyal/p/5077249.html
Copyright © 2020-2023  润新知