Boost 地址:
fisher/boost_1_74_0.git
一、通用规则
多数库是不需要预先编译的,include hpp文件就能用。如果出现链接失败,那就是可能需要编译库了。
boost自带一套编译工具bjam,bjam本身是跨平台的,并且也要自行编译出来。在boost目录下有 bootstrap.sh 和 bootstrap.bat 两个脚本分别用来编译linux和windows下的bjam。
bootstrap脚本可以传入参数,以在编译 bjam 过程中生成特定的编译boost的配置。这些配置保存在新生成的 project-config.jam 里,但还可以在运行bjam的时候再传入参数来覆盖。同时生成的b2是bjam的代理,运行哪个的效果都差不多。
执行bootstrap.bat后,会在boost根目录生成 b2.exe 、bjam.exe 、project-config.jam 、bootstrap.log四个文件。其中,b2.exe 、bjam.exe 这两个exe作用是一样的,bjam.exe 是老版本,b2是bjam的升级版本。
|
| 参数 | 功能 | 相应值 |
|---|---|---|
| stage/install | stage 表示只生成库(dll 和 lib),install 还会生成包含头文件的 include 目录。推荐使用 stage,因为 install 生成的 include 目录实际就是源码包下的 boost 目录,需要 include 的时候可以直接使用,不需要再次生成,这样可以节省大量的编译时间。 | stage |
| toolset | 指定编译器,可选的如 borland、gcc、msvc-14.0(VS2015)等。如果不指定,会自动搜索本地可用的编译器(可查看 ./project-config.jam 文件以确认)。 | borland、gcc、msvc-14.2 |
| architecture | 表示架构,也就是你的CPU架构,因为我安装的是win7 32位,所以使用了x86的架构 | x86 |
| address-model | 表示地址长度为32位或64 要有address-model=64属性,如果没有这个属性的话,会默认生成32位的平台库,加入这个选项才能生成64位的DLL | 32/64 |
| link | 指定生成动态链接库还是静态链接库,取值为 static/shared。生成静态链接库使用 static,生成动态链接库需使用 shared。如不指定,默认使用 static。静态库的缺点是占用空间比较大,优点是程序发布的时候无需附带 Boost 库的 dll,比较整洁。推荐使用静态库的方式编译 Boost.python,这样发布程序的时候就不用 Boost 的 dll 了,并且也多占用不了太多空间。 | static/shared |
| runtime-link | 指定运行时是动态还是静态链接其他库。同样有 shared 和 static 两种方式。如果不指定,默认是 shared,一般无需设置。 | static/shared |
| threading | 要编译的库是单线程还是多线程,可取值 single/multi。如果不指定,默认是 multi,一般无需设置。 | single/multi |
| variant | debug/release,编译 debug 版本还是 release 版本。一般与最终发布的程序是 debug 还是 release 版相对应。如果不指定,默认两个都编译,一般无需设置。 | debug,release |
| –build-dir | 编译生成的中间文件的路径,默认是 Boost 根目录下的 bin.v2 目录,一般无需设置。 | |
| –stagedir/–prefix | stage 时使用 stagedir,install 时使用 prefix,表示编译生成文件的路径。推荐给不同的编译环境指定不同的目录,如 Visual Studio 2015 的 x86 应用对应的是 bin/lib32-msvc-14.0,x64 应用对应的是 bin/lib64-msvc-14.0。如果都生成到一个目录下,将没有任何益处,徒增管理难度。如果使用了 install 参数,那么还将在上述指定的目录下生成 include 目录,用于保存头文件。 | |
| –without- |
选择不编译/编译哪些库(类似于黑名单/白名单)。–with-python 的含义是仅编译 python,其他的都不编译。反过来,如果用 –without-python,意思就是除了 python, 其他的都编译。with/without 参数可以多次出现,以限定多个库。如果不设置 with/without 参数,默认全部编译,可能需要几个小时的时间!需要注意,编译 Boost.python 需要确保本地安装了 Python,并且 python 命令已加入环境变量。要查看 Boost 包含的所有库,可使用以下命令:b2.exe –show-libraries | |
| 不常用指令 | ||
| instruction-set | 表示指令集,依然是8086指令集 | |
| –show-libraries | 显示需要编译的库名称 |
- 动态库编译
指定编译选项:link=shared
- 静态库编译
指定编译选项:link=static runtime-link=static ,其中link表示编译静态库,runtime-link表示静态连接c++运行库
- 完全编译
如果需要编译所有库则不需要单独指定–witch-组件名,直接使用编译选项:–build-type=complete
- 带安装编译
默认情况下不指定prefix和install,不会安装库到指定目录,如果添加–prefix选项且含有install关键字
如:–stagedir=”E:\boost_1_63_0\64” –build-dir=”E:\boost_1_63_0\64\build” 指定编译库和中间文件路径
如:–prefix=”E:\boost_1_63_0\include” install 则拷贝boost所有的头文件到include
- 编译不同系统位
如果编译32位,则使用architecture=x86 address-model=32
如果编译64为,则使用architecture=x86 address-model=64
其中architecture=x86指定cpu为x86系列,address-model指定使用32位地址还是64位地址;
- –build-type=complete 表示编译所有版本(编译所有版本,不然只会编译一小部分版本(确切地说是相当于:variant=release, threading=multi;link=shared|static;runtime-link=shared))
二、iOS平台编译
|
工具 版本 macOS 11.2.3 Xcode 12.4(12D4e) boost 1.74.0
如果用Xcode 7在模拟器版链接失败,往 ${EXTRA_CPPFLAGS:= 添加-miphoneos-version-min=7参数
步骤:
1、把下面的脚本保存成 ios_build_boost.sh,直接运行即可:
|
???注:还未使用过
把编译集成到Xcode
做iOS的同学还是习惯完全用Xcode的吧。所以可以把上面的脚本集成到xcode里。在某个工程中,Xcode菜单File->New->Target…->Other->Aggregate->取名boost,Finish->在这个target的属性中选择Build Phases->点击左边的+号->New Run Script Phase->填入bash ./build_boost.sh->自己再填好库文件搜索路径和链接各个boost库。主target还要设置依赖boost target,免得boost编译前就链接以致错误。
三、Mac OS X编译
工具 版本 macOS 11.2.3 Xcode 12.4(12D4e) boost 1.74.0
步骤:
1、把下面的脚本保存成 mac_build_boost.sh,直接运行即可:
|
四、Windows平台编译
工具 版本 Win10 Virtual Studio 2019 14.28 boost 1.74.0
1、先进入目录执行
|
2、以下是build_boost.bat的内容,直接执行即可:注意这里生成的是MTd和M。MD的话runtime-link=shared。

>MSC 1.0 _MSC_VER == 100
>MSC 2.0 _MSC_VER == 200
>MSC 3.0 _MSC_VER == 300
>MSC 4.0 _MSC_VER == 400
>MSC 5.0 _MSC_VER == 500
>MSC 6.0 _MSC_VER == 600
>MSC 7.0 _MSC_VER == 700
>MSVC++ 1.0 _MSC_VER == 800
>MSVC++ 2.0 _MSC_VER == 900
>MSVC++ 4.0 _MSC_VER == 1000 (Developer Studio 4.0)
>MSVC++ 4.2 _MSC_VER == 1020 (Developer Studio 4.2)
>MSVC++ 5.0 _MSC_VER == 1100 (Visual Studio 97 version 5.0)
>MSVC++ 6.0 _MSC_VER == 1200 (Visual Studio 6.0 version 6.0)
>MSVC++ 7.0 _MSC_VER == 1300 (Visual Studio .NET 2002 version 7.0)
>MSVC++ 7.1 _MSC_VER == 1310 (Visual Studio .NET 2003 version 7.1)
>MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005 version 8.0)
>MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008 version 9.0)
>MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010 version 10.0)
>MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012 version 11.0)
>MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013 version 12.0)
>MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015 version 14.0)
>MSVC++ 14.1 _MSC_VER == 1910 (Visual Studio 2017 version 15.0)
>MSVC++ 14.11 _MSC_VER == 1911 (Visual Studio 2017 version 15.3)
>MSVC++ 14.12 _MSC_VER == 1912 (Visual Studio 2017 version 15.5)
>MSVC++ 14.13 _MSC_VER == 1913 (Visual Studio 2017 version 15.6)
>MSVC++ 14.14 _MSC_VER == 1914 (Visual Studio 2017 version 15.7)
>MSVC++ 14.15 _MSC_VER == 1915 (Visual Studio 2017 version 15.8)
>MSVC++ 14.16 _MSC_VER == 1916 (Visual Studio 2017 version 15.9)
>MSVC++ 14.2 _MSC_VER == 1920 (Visual Studio 2019 Version 16.0)
>MSVC++ 14.21 _MSC_VER == 1921 (Visual Studio 2019 Version 16.1)
>MSVC++ 14.22 _MSC_VER == 1922 (Visual Studio 2019 Version 16.2)
Developer Command Prompt - Sets the environment to use 32-bit, x86-native tools to build 32-bit, x86-native code.
x86 Native Tools Command Prompt - Sets the environment to use 32-bit, x86-native tools to build 32-bit, x86-native code.
x64 Native Tools Command Prompt - Sets the environment to use 64-bit, x64-native tools to build 64-bit, x64-native code.
x86_x64 Cross Tools Command Prompt - Sets the environment to use 32-bit, x86-native tools to build 64-bit, x64-native code.
x64_x86 Cross Tools Command Prompt - Sets the environment to use 64-bit, x64-native tools to build 32-bit, x86-native code.
由以上的文件夹层次结构基本就可以得出结论:
1、以“lib”开头的是“link-static”版本的,而直接以“boost”开头的是“link-shared”版本的。
2、有“d”的为debug版本,没有的则是release版本。
3、有“s”的为“runtime-link-static”版本,没有的则是“runtime-link-shared”版本。
4、有“mt”的为“threading-multi”版本,没有的则是“threading-single”版本。
3、选择 x86_x64 Cross Tools Command Prompt for VS 2019,并新建 win32_build_boost.bat,写入以下脚本
|
|
4、集成到VS(未使用)
工程属性->Configuration Properties->Build Events->Pre-Link Event->Command Line->填入build_boost.bat
还有设置好库搜索路径和依赖的库。
Windows的boost有个特点,代码里有#pragma comment(lib, “xxxx”),所以可以不设置依赖的库。但是如果工程设置不对而有link错误,那还是手动加进去吧。
五、Android平台编译
- Android的编译方法有两种:一种是和iOS一样,自己覆盖project-config.jam引入NDK的编译工具设置,然后用bjam编译;另一种是自己写Android.mk。自己写project-config.jam因为要兼顾很多种CPU架构而(无论是写jam还是主工程的Android.mk都)较为麻烦,所以本文用后者。
- 环境
Ubuntu 14.04 64bit / Linux Mint 17 64bit
NDK r10c
boost 1.57/1.58
- 步骤
想要哪个库,自己把那个库下的cpp文件加到mk里,都在libs/xxxx/下。如果在libs找不到,说明这个库是不需要额外编译的。
以下是编译四个库的Android.mk的内容:
|
Application.mk的内容:\
|
这是最普通的做法,如果加编译参数,还得自己琢磨下。例如不要rtti,就得LOCAL_CFLAGS += -DBOOST_NO_RTTI。
还是想用boost原生的编译方法的话,可参考这里 http://stackoverflow.com/questions/30491158/compile-and-use-boost-for-android-ndk-r10e
- 调用ndk-build
然后网上搜了一下
You need to specify 3 things.
NDK_PROJECT_PATH - the location of your project
NDK_APPLICATION_MK - the path of the Application.mk file
APP_BUILD_SCRIPT - the path to the Android.mk file
These are needed to override the default values of the build script, which expects things to be in the jni folder.
When calling ndk-build use
ndk-build NDK_PROJECT_PATH=/path/to/proj NDK_APPLICATION_MK=/path/to/Application.mk
In Application.mk add
APP_BUILD_SCRIPT := /path/to/Android.mk
然后通过以下命令就生成成功了
ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk
这里要注意一下,如果ndk-build没有指定NDK_APPLICATION_MK参数,则需要指定APP_BUILD_SCRIPT参数
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk
成功编译的方法
|
https://gist.github.com/donaldmunro/33393dbe3d4910dcf984ef0ed4608c63
六、Linux平台编译(未使用)
- 环境
Ubuntu 14.04 64bit / Linux Mint 17 64bit
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
boost 1.57/1.58
- 步骤
终端命令
|
|
可留意
|
转载请注明来源,欢迎指出任何有错误或不够清晰的表达。可以邮件至 xiyugee@qq.com