boost全平台编译方法

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 0
fi

# 以下代码参考 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.sh

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 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 stage

echo "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 stage

echo "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"

集成到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_0
if 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类似。



转载请注明出处:http://blog.csdn.net/hursing

时间: 2025-01-01 16:22:08

boost全平台编译方法的相关文章

SQLite3源码在Windows及WinCE平台下的编译方法

好久没有写博客了,最近有时间又开始写点东西. 最近,刚好需要用到SQLite3数据库,就自己研究了一下,这个的确是个好东西,开源的东西都还不错. 好了,言归正传.相信不少人在用SQLite3源码编译的时候还是费了不少劲的,网上找来的东西都讲的不是很完整. 下面,我就将自己的编译方法写了出来. 首先从SQLite官方网站http://www.sqlite.org/download.html 下载最新的源代码,目前最新的版本是V3.7.11(2012年3月25日星期日). 需要下载在源码如下: sq

c++-同时使用STLport和boost库时编译通过,但链接失败,求解决方案,急!!!

问题描述 同时使用STLport和boost库时编译通过,但链接失败,求解决方案,急!!! 具体问题是这样的: 我用的是vs2008,把STLport和boost库都加入项目,编译时报错:boostconfigauto_link.hpp(204): fatal error C1189: #error : "Build options aren't compatible with pre-built libraries" 解决方法是在 项目属性->c/c++->命令行 添加

全平台支付一机搞定 海信Hi98智能POS机评测

1.互联网支付解决方案 海信Hi98智能POS机全平台兼容 互联网时代让我们的生活发生的很大的变化,就连平时购物消费使用信用卡消费的次数越来越少了,随着支付宝.微信支付.百度钱包.ApplePay等移动支付平台的出现,传统的POS正在受到新的支付方式的挑战和颠覆.在线上线下商业融合的大潮流下,人们的消费认知也在不断发生变化. 如今互联网智能设备盛行的今天,海信也已经进军智能支付终端领域了,而且率先推出了一款能够打通全部支付方式的神器--海信Hi98智能POS机,为商户提供了全面的互联网支付解决方

Boost下载安装编译配置使用指南

转载:http://www.cppblog.com/jerryma/archive/2011/10/17/158554.html --更新于2011/7/19,目前我已对boost的安装和使用有了新的认识,因此也会对两年前写的这篇文章做大幅修改,网上转载版本泛滥,请以本文为准. 理论上,本文适用于boost的各个版本,尤其是最新版本1.47.0:适用于各种C++编译器,如VC6.0(部分库不支持),VS2003,VS2005,VS2008,VS2010,gcc,C++ Builder等.先总结一

Boost下载安装编译配置使用指南(含Windows和Linux

理论上,本文适用于boost的各个版本,尤其是最新版本1.45.0:适用于各种C++编译器,如VC6.0(部分库不支持),VS2003,VS2005,VS2008,gcc,C++ Builder等.先总结一下Windows系统.一.下载首先从boost官方主页附链接下载最新版boost安装包(目前最新版是boost_1_45_0.7z).二.安装将boost安装包解压至本地目录,如:E:\SDK\boost_1_45_0.因为boost一部分类是需要编译成库才能使用的,所以我们还需要准备好boo

linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程_php技巧

本文实例讲述了linux平台编译安装PHP7并安装Redis扩展与Swoole扩展的方法.分享给大家供大家参考,具体如下: 前面<PHP7安装Redis扩展教程[Linux与Windows平台]>一文告诉读者简单的安装Redis的方法,下面我们来实现在linux中编译安装PHP7并安装Redis扩展与Swoole扩展的方法. 编译安装PHP7并安装Redis扩展Swoole扩展: 在编译php7的机器上已经有编译安装过php5.3以上的版本,从而依赖库都有了 本php7是编译成fpm-php

《Android框架揭秘》——2.2节搭建Android平台编译环境

2.2 搭建Android平台编译环境Android框架揭秘前面,我们讲解了在Windows平台下安装虚拟机,以及在虚拟机下安装Ubuntu的相关知识.下面我们将讲解Android所需要的一些编译工具,以及下载Android平台源码的方法. 2.2.1 编译工具在Ubuntu Linux(32-bit x86环境)中编译Android平台之前,首先要在Linux中安装如下工具或包. 2.2.2 安装RepoAndroid源代码十分庞大,通过Git版本控制工具管理源码,Android是由kerne

《CMOS集成电路后端设计与实战》——2.2 后端全定制设计方法

2.2 后端全定制设计方法 后端全定制设计的目标就是以最小的面积与功耗代价获得性能最高的物理设计结果,涉及布局规划.结构设计.电路设计.流片厂工艺等多方面的因素.在后端全定制设计中,每个晶体管的尺寸.形状.布局位置以及与其他器件的互连都经过精心考虑,由后端全定制设计者手工完成,因此可以获得最高的性能且面积最小.功耗最低.同样由于电路和版图设计完全由后端全定制设计者手工完成,因此后端全定制设计的自动化程度很低.设计周期长.成本比较高.虽然如此,对于那些性能要求很高同时生产量比较大的部件设计如存储器

网页播放器实现全屏的方法总结

网页    网页播放器全屏的方法(有点气,少写了)这是自己总结的,刚刚要完的时候点错了,重新发送一次,老子好气,该打游戏的时间,浪费了,这里就偷工减料了!    1.media player全屏方法    <script language="JavaScript">    <!--     var Real;    Real='MediaPlayer1.';    var Mute=false;    var CanSetPos=true;    var SetPos