通用规则android
iOS平台编译c++
环境git
步骤github
集成到Xcodemacos
Android平台编译bootstrap
环境ubuntu
步骤windows
Windows平台编译xcode
环境bash
步骤
集成到VS
Linux平台编译
环境
步骤
Mac OS X编译
环境
步骤
原文地址: http://blog.csdn.net/hursing/article/details/45439087
1.通用规则
多数库是不须要预先编译的,include hpp文件就能用。若是出现连接失败,那就是可能须要编译库了。
boost自带一套编译工具bjam,bjam自己是跨平台的,而且也要自行编译出来。在boost目录下有bootstrap.sh和bootstrap.bat两个脚本分别用来编译*nix和windows下的bjam。bootstrap脚本能够传入参数,以在编译bjam过程当中生成特定的编译boost的配置。这些配置保存在新生成的project-config.jam里,但还能够在运行bjam的时候再传入参数来覆盖。同时生成的b2是bjam的代理,运行哪一个的效果都差很少。
在终端下运行
bjam --show-libraries
会列出全部要编译的库。
真正编译时,能够传入–with-xxx来选择编译哪些库,或者传入–without-xxx来选择不编译哪些库。若是不传则会读取project-config.jam的设置,若是也没有则是编译所有的库。
更多的参数能够用
bjam --help
来查看。例如编译成静态库仍是动态库,运行时库是静态的仍是动态的,编译完后要不要安装等。
注意:
旧版本的boost可能会存在编译问题,尽可能用新的就好。bjam在*nix和windows支持的参数有不一样。
2. iOS平台编译
环境:
OS X Yosemite 10.10.3
Xcode 6.3.1(6D1002)。若是用Xcode 7在模拟器版连接失败,往 ${EXTRA_CPPFLAGS:= 添加-miphoneos-version-min=7参数
boost 1.57/1.58
步骤:
把下面的脚本保存成build_boost.sh,直接运行便可:
#!/bin/bash# http://blog.csdn.net/hursing/article/details/45439087# 请自行修改路径,cd到boost解压后的目录下dir=`dirname $0`cd "$dir/../../third_party/boost_1_57_0"# 若是库文件已存在,直接退出if [ -e ./stage/lib/libboost_date_time.a ]; then
echo "libraries exist. no need to build."
exit 0fi# 如下代码参考 https://gist.github.com/rsobik/7513324 ,原文使用的boost版本比较旧,不能使用。: ${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"echo "bootstrap"# 此脚本若是是被Xcode调用的话,会由于xcode export的某些变量致使失败,因此加了env -i。直接在命令行运行此脚本能够把env -i 去掉env -i bash ./bootstrap.shecho "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 iphone dev"./bjam -j16 --with-date_time --with-filesystem --with-system --with-thread --build-dir=iphone-build --stagedir=iphone-build/stage toolset=darwin architecture=arm target-os=iphone macosx-version=iphone-${IPHONE_SDKVERSION} define=_LITTLE_ENDIAN link=static stageecho "build boost iphone sim"./bjam -j16 --with-date_time --with-filesystem --with-system --with-thread --build-dir=iphonesim-build --stagedir=iphonesim-build/stage --toolset=darwin-${IPHONE_SDKVERSION}~iphonesim architecture=ia64 target-os=iphone macosx-version=iphonesim-${IPHONE_SDKVERSION} link=static stageecho "lipo"# 把各架构下的库文件合一,以便在xcode里能够少设置些搜索路径。作得更完全些是各个分库合成一个大库。不过除非是把静态库加入到代码仓库,不然是浪费时间了。要合成的大库话请参考https://gist.github.com/rsobik/7513324原文。mkdir -p stage/lib
lipo -create iphone-build/stage/lib/libboost_date_time.a iphonesim-build/stage/lib/libboost_date_time.a -output stage/lib/libboost_date_time.a
lipo -create iphone-build/stage/lib/libboost_filesystem.a iphonesim-build/stage/lib/libboost_filesystem.a -output stage/lib/libboost_filesystem.a
lipo -create iphone-build/stage/lib/libboost_system.a iphonesim-build/stage/lib/libboost_system.a -output stage/lib/libboost_system.a
lipo -create iphone-build/stage/lib/libboost_thread.a iphonesim-build/stage/lib/libboost_thread.a -output stage/lib/libboost_thread.a# 库文件最终放在./stage/lib/下echo "Completed successfully"1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
集成到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编译前就连接以至错误。

3.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
4.Windows平台编译
环境
Windows 7 旗舰版 64bit SP1
Visual Studio Ultimate 2013
boost 1.57/1.58
步骤
如下是build_boost.bat的内容,直接执行便可:
cd ..\..\third_party\boost_1_57_0if not exist .\b2.exe (
call .\bootstrap.bat .\b2.exe -j5 --with-date_time --with-filesystem --with-system --with-thread --with-regex link=static runtime-link=static
)
注意这里生成的是MTd和MT。MD的话runtime-link=shared。
集成到VS
工程属性->Configuration Properties->Build Events->Pre-Link Event->Command Line->填入build_boost.bat
还有设置好库搜索路径和依赖的库。
Windows的boost有个特色,代码里有#pragma comment(lib, "xxxx")
,因此能够不设置依赖的库。可是若是工程设置不对而有link错误,那仍是手动加进去吧。
5.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
这样就能在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,须要重复键名,而不是加双引号把多个值赋给同一个。红色的部分是隐藏符号。
6.Mac OS X编译
环境
OS X Yosemite 10.10.3
Xcode 6.3.1(6D1002)
boost 1.57/1.58
步骤
和Linux相同。集成到Xcode的步骤和iOS相似。