boost-全平台编译方法-己验证

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的升级版本。

#在终端下运行:
#生成bjam
#Mac :
./bootstrap.sh
#Win:
bootstrap.bat

#列出所有要编译的库
#Mac:
./b2 --show-libraries
#Win:
b2 --show-libraries
#真正编译时,可以传入–with-xxx来选择编译哪些库,或者传入–without-xxx来选择不编译哪些库。如果不传则会读取project-config.jam的设置,如果也没有则是编译全部的库。

#更多的参数可以用以下命令来查看。例如编译成静态库还是动态库,运行时库是静态的还是动态的,编译完后要不要安装等。
#注意:
#旧版本的boost可能会存在编译问题,尽量用新的就好。bjam在linux和windows支持的参数有不同。
#Mac:
./b2 --help
#Win:
b2 --help

  • 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- 选择不编译/编译哪些库(类似于黑名单/白名单)。–with-python 的含义是仅编译 python,其他的都不编译。反过来,如果用 –without-python,意思就是除了 python, 其他的都编译。with/without 参数可以多次出现,以限定多个库。如果不设置 with/without 参数,默认全部编译,可能需要几个小时的时间!需要注意,编译 Boost.python 需要确保本地安装了 Python,并且 python 命令已加入环境变量。要查看 Boost 包含的所有库,可使用以下命令:b2.exe –show-libraries
不常用指令
instruction-set 表示指令集,依然是8086指令集
–show-libraries 显示需要编译的库名称
  1. 动态库编译
    指定编译选项:link=shared
    1. 静态库编译
      指定编译选项:link=static runtime-link=static ,其中link表示编译静态库,runtime-link表示静态连接c++运行库
      1. 完全编译
        如果需要编译所有库则不需要单独指定–witch-组件名,直接使用编译选项:–build-type=complete
        1. 带安装编译
          默认情况下不指定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
          1. 编译不同系统位
            如果编译32位,则使用architecture=x86 address-model=32
            如果编译64为,则使用architecture=x86 address-model=64
            其中architecture=x86指定cpu为x86系列,address-model指定使用32位地址还是64位地址;
            1. –build-type=complete 表示编译所有版本(编译所有版本,不然只会编译一小部分版本(确切地说是相当于:variant=release, threading=multi;link=shared|static;runtime-link=shared))

二、iOS平台编译

xcodebuild -showsdks        #xcode中查看ios sdk版本
工具 版本
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,直接运行即可:

#!/bin/bash
# http://blog.csdn.net/hursing/article/details/45439087
# 请自行修改路径,cd到boost解压后的目录下
dir=`dirname $0`
cd "$dir/.."
# 如果库文件已存在,直接退出
# if [ -e ./stage/lib/libboost_date_time.a ]; then
# echo "libraries exist. no need to build."
# exit 0
# fi

# 以下代码参考 https://gist.github.com/rsobik/7513324 ,原文使用的boost版本比较旧,不能使用。
#
#注意:行首的冒号(:)是做什么呢,如果没有这个符号,那么在脚本中会把赋值后字符作为命令来执行,
#冒号是linux中一个内置的命令,相当于true,其实是啥也不做,空命令,
#冒号后的赋值作为命令的参数来解析,而不是执行

#结论:使用"="时,当变量不存在(未申明)才对其复制,
#而":="是变量不存在或值为空时才对其赋值

: ${COMPILER:="clang++"}
: ${IPHONE_SDKVERSION:=`xcodebuild -showsdks | grep iphoneos | egrep "[[:digit:]]+\.[[:digit:]]+" -o | tail -1`}
: ${XCODE_ROOT:=`xcode-select -print-path`}
: ${EXTRA_CPPFLAGS:="-DBOOST_AC_USE_PTHREADS -DBOOST_SP_USE_PTHREADS -stdlib=libc++"}

echo "IPHONE_SDKVERSION: $IPHONE_SDKVERSION"
echo "XCODE_ROOT: $XCODE_ROOT"
echo "COMPILER: $COMPILER"

if [ ! -e ./b2 ]; then
echo "bootstrap"
# 此脚本如果是被Xcode调用的话,会因为xcode export的某些变量导致失败,所以加了env -i。直接在命令行运行此脚本可以把env -i 去掉
env -i bash ./bootstrap.sh
fi

echo "write project-config.jam"
# 默认生存的project-config.jam是编译Mac版的,这里直接调换掉
rm project-config.jam
cat >> project-config.jam <<EOF
using darwin : ${IPHONE_SDKVERSION}~iphone
: $XCODE_ROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/$COMPILER -arch armv7 -arch arm64 $EXTRA_CPPFLAGS
: <striper> <root>$XCODE_ROOT/Platforms/iPhoneOS.platform/Developer
: <architecture>arm <target-os>iphone
;
using darwin : ${IPHONE_SDKVERSION}~iphonesim
: $XCODE_ROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/$COMPILER -arch i386 -arch x86_64 $EXTRA_CPPFLAGS
: <striper> <root>$XCODE_ROOT/Platforms/iPhoneSimulator.platform/Developer
: <architecture>ia64 <target-os>iphone
;
EOF
# 上面的代码里,两个using darwin分别是编译真机版和模拟器版的设置。每多一种CPU架构就要再加一个-arch xxx。

echo "build boost ios"
./b2 -j16 stage toolset=darwin architecture=arm target-os=iphone macosx-version=iphone-${IPHONE_SDKVERSION} define=_LITTLE_ENDIAN address-model=64 link=static runtime-link=static threading=multi variant=release --build-dir=build-obj/ios --stagedir=libs-stage/ios

echo "build boost ios-sim"
./b2 -j16 stage toolset=darwin-${IPHONE_SDKVERSION}~iphonesim architecture=ia64 target-os=iphone macosx-version=iphonesim-${IPHONE_SDKVERSION} address-model=64 link=static runtime-link=static threading=multi variant=release --build-dir=build-obj/ios-sim --stagedir=libs-stage/ios-sim

echo "lipo"
# 把各架构下的库文件合一,以便在xcode里可以少设置些搜索路径。做得更彻底些是各个分库合成一个大库。不过除非是把静态库加入到代码仓库,否则是浪费时间了。要合成的大库话请参考https://gist.github.com/rsobik/7513324原文。
mkdir -p libs-stage/iphone

path=`pwd`
filelist=$(ls $path/libs-stage/ios/lib | grep lib)
for filename in ${filelist}
do
#echo $filename >> filename.txt
lipo -create libs-stage/ios/lib/${filename} libs-stage/ios-sim/lib/${filename} -output libs-stage/iphone/${filename}
done

echo "Completed successfully"

???注:还未使用过

把编译集成到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,直接运行即可:

#!/bin/bash

dir=`dirname $0`
cd "$dir/.."

if [ -e ./project-config.jam ]; then
rm ./project-config.jam
fi

if [ ! -e ./b2 ]; then
echo "bash bootstrap"
env -i bash ./bootstrap.sh
fi

#./b2 stage link=static --build-dir=build-obj/macos --stagedir=libs-stage/macos

./b2 stage toolset=darwin architecture=x86 address-model=64 link=static runtime-link=static threading=multi variant=release --build-dir=build-obj/macos --stagedir=libs-stage/macos

echo "Completed successfully"

四、Windows平台编译

工具 版本
Win10
Virtual Studio 2019 14.28
boost 1.74.0
1、先进入目录执行
# 在cmd 运行
bootstrap.bat

b2 --show-libraries

b2 --help

1

>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,写入以下脚本
@echo off & setlocal enabledelayedexpansion
cd %~dp0..\

::if exist !cd!\libs-stage\x86\lib\libboost_random-vc142-mt-gd-x32-1_70.lib (
:: echo libraries exist. no need to build...
:: goto END
::)

::32
::b2 stage toolset=msvc-14.2 architecture=x86 address-model=32 link=static runtime-link=static threading=multi variant=debug,release --build-type=complete --build-dir=build-obj\win32\x86 --stagedir=libs-stage\win32\x86
b2 stage toolset=msvc-14.2 architecture=x86 address-model=32 link=static runtime-link=shared threading=multi variant=debug,release --build-type=complete --build-dir=build-obj\win32\x86 --stagedir=libs-stage\win32\x86
::b2 stage toolset=msvc-14.2 architecture=x86 address-model=32 link=shared runtime-link=shared threading=multi variant=debug,release --build-type=complete --build-dir=build-obj\win32\x86 --stagedir=libs-stage\win32\x86

::64
::b2 stage toolset=msvc-14.2 architecture=x86 address-model=64 link=static runtime-link=static threading=multi variant=debug,release --build-type=complete --build-dir=build-obj\win32\x64 --stagedir=libs-stage\win32\x64
b2 stage toolset=msvc-14.2 architecture=x86 address-model=64 link=static runtime-link=shared threading=multi variant=debug,release --build-type=complete --build-dir=build-obj\win32\x64 --stagedir=libs-stage\win32\x64

:END
pause
老的生成方法
::set stagedir = %~dp0..\win32-build\stage\
cd %~dp0..\
bjam stage --toolset=msvc-14.0 architecture=x86 --build-dir=win32-build --stagedir=win32-build\stage link=static runtime-link=shared threading=multi debug release
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的内容:

include $(CLEAR_VARS)
LOCAL_PATH := $(ROOT_PATH)/third_party/boost_1_57_0
LOCAL_MODULE := boost
# 需要编译哪个库,自行把libs目录下的cpp加进来即可。
LOCAL_SRC_FILES += \
libs/filesystem/src/path.cpp \
libs/filesystem/src/path_traits.cpp \
libs/filesystem/src/operations.cpp \
libs/filesystem/src/codecvt_error_category.cpp \
libs/filesystem/src/portability.cpp \
libs/filesystem/src/utf8_codecvt_facet.cpp \
\
libs/date_time/src/gregorian/date_generators.cpp \
libs/date_time/src/gregorian/greg_month.cpp \
libs/date_time/src/gregorian/greg_weekday.cpp \
libs/date_time/src/gregorian/gregorian_types.cpp \
libs/date_time/src/posix_time/posix_time_types.cpp \
\
libs/system/src/error_code.cpp \
\
libs/thread/src/future.cpp \
libs/thread/src/pthread/once.cpp \
libs/thread/src/pthread/once_atomic.cpp \
libs/thread/src/pthread/thread.cpp
# 如果要把boost集成到动态库里,-fPIC是必须的,不然会有链接错误。原因请自行Google
LOCAL_CFLAGS += -fPIC -frtti -fexceptions
include $(BUILD_STATIC_LIBRARY)

Application.mk的内容:\

APP_PLATFORM := android-19
APP_OPTIM := release
APP_CFLAGS += -Wall
APP_STL := gnustl_static
APP_ABI := armeabi-v7a

这是最普通的做法,如果加编译参数,还得自己琢磨下。例如不要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

成功编译的方法

Boost-for-Android

下载:android-ndk-r20-linux-x86_64 (从官网下载,解压,拷贝到ubuntu)
然后下载Boost-for-Android:https://github.com/moritz-wundke/Boost-for-Android
git clone https://github.com/moritz-wundke/Boost-for-Android
进入 Boost-for-Android下,打开build-android.sh文件,删除第348这一行 CONFIG_VARIANT=ndk19(编译的话会提示找不到jam等文件,因为CONFIG_VARIANT=ndk19这个是多余的)
然后到Boost-for-Android的目录执行:(Boost-for-Android会主动下载boost)---一定要在sudo,超级权限下编译

./build-android.sh --boost=1.74.0 /Users/janwe/DevTools/AdrTools/android-ndk-r21e --arch=arm64-v8a,armeabi-v7a

生成的在Boost-for-Android\build\out\目录下。
\# 其他参考指令./build-android.sh ndk_dir --with-libraries=date_time,system,random --arch=arm64-v8a,armeabi-v7a
–with-libraries 指定你需要的boost的库,根据自己的需要添加;
arch 指定你需要的指令集,根据自己的需要添加;
/mnt/hgfs/sharefile/android-ndk-r20-linux-x86_64/android-ndk-r20

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
  • 步骤
    终端命令
cd boost_1_57_0 
bash bootstrap.sh

./b2 -j10 stage address-model=64 link=static runtime-link=static threading=multi variant=release --build-dir=build-obj/linux-build --stagedir=libs-stage/linux

./b2 -j10 stage address-model=64 link=shared runtime-link=shared threading=multi variant=release --build-dir=build-obj/linux-build --stagedir=libs-stage/linux
这样就能在boost_1_57_0/stage/lib/下找到所有的库文件。
如果用cmake来组织编译,以下是主工程的CMakeLists.txt里的部分内容:
include(ExternalProject)
ExternalProject_Add(boost
SOURCE_DIR ${ROOT_DIR}/third_party/boost_1_57_0
CONFIGURE_COMMAND bash ${ROOT_DIR}/third_party/boost_1_57_0/bootstrap.sh --with-libraries=date_time,thread,filesystem,system
BUILD_COMMAND ${ROOT_DIR}/third_party/boost_1_57_0/b2 -j10 cflags=-fPIC cxxflags=-fPIC cxxflags=-fvisibility=hidden cxxflags=-fvisibility-inlines-hidden cxxflags=-fexceptions cxxflags=-DBOOST_NO_RTTI
BUILD_IN_SOURCE 1
INSTALL_COMMAND ""
)
set(
BOOST_LIBRARIES
${ROOT_DIR}/third_party/boost_1_57_0/stage/lib/libboost_date_time.a
${ROOT_DIR}/third_party/boost_1_57_0/stage/lib/libboost_system.a
${ROOT_DIR}/third_party/boost_1_57_0/stage/lib/libboost_thread.a
${ROOT_DIR}/third_party/boost_1_57_0/stage/lib/libboost_filesystem.a
)
# ...
# 下面是设置链接和依赖
target_link_libraries(your_target ${BOOST_LIBRARIES})
add_dependencies(your_target boost)

可留意

b2 -j10 cflags=-fPIC cxxflags=-fPIC cxxflags=-fvisibility=hidden cxxflags=-fvisibility-inlines-hidden cxxflags=-fexceptions cxxflags=-DBOOST_NO_RTTI 
# 如果要传递多个cflags,需要重复键名,而不是加双引号把多个值赋给同一个。红色的部分是隐藏符号。

转载请注明来源,欢迎指出任何有错误或不够清晰的表达。可以邮件至 xiyugee@qq.com