通用規則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相似。