boost全平台編譯方法,boost平台編譯方法

來源:互聯網
上載者:User

boost全平台編譯方法,boost平台編譯方法
0.通用規則

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支援的參數有不同。

1. iOS平台編譯環境:

OS X Yosemite 10.10.3
Xcode 6.3.1(6D1002)
boost 1.57

步驟:

把下面的指令碼儲存成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.jamcat >> project-config.jam <<EOFusing darwin : ${IPHONE_SDKVERSION}~iphone: $XCODE_ROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/$COMPILER -arch armv7 -arch arm64 -fvisibility=hidden -fvisibility-inlines-hidden $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 x86_64 -fvisibility=hidden -fvisibility-inlines-hidden $EXTRA_CPPFLAGS: <striper> <root>$XCODE_ROOT/Platforms/iPhoneSimulator.platform/Developer: <architecture>ia64 <target-os>iphone;EOF# 上面的代碼裡,兩個using darwin分別是編譯真機版和模擬器版的設定。每多一種CPU架構就要再加一個-arch xxx。例如模擬器版,如果是32位的cpu,可以再加上-arch i386echo "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/liblipo -create iphone-build/stage/lib/libboost_date_time.a iphonesim-build/stage/lib/libboost_date_time.a -output stage/lib/libboost_date_time.alipo -create iphone-build/stage/lib/libboost_filesystem.a iphonesim-build/stage/lib/libboost_filesystem.a -output stage/lib/libboost_filesystem.alipo -create iphone-build/stage/lib/libboost_system.a iphonesim-build/stage/lib/libboost_system.a -output stage/lib/libboost_system.alipo -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編譯前就連結以致錯誤。

2.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

步驟

以下是Android.mk的內容:

include $(CLEAR_VARS)LOCAL_PATH := $(ROOT_PATH)/third_party/boost_1_57_0LOCAL_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# 如果要把boost整合到動態庫裡,-fPIC是必須的,不然會有連結錯誤。原因請自行GoogleLOCAL_CFLAGS += -fPIC -frtti -fexceptionsinclude $(BUILD_STATIC_LIBRARY)
3.Windows平台編譯環境

Windows 7 旗艦版 64bit SP1
Visual Studio Ultimate 2013
boost 1.57

步驟

以下是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)

整合到VS:
工程屬性->Configuration Properties->Build Events->Pre-Link Event->Command Line->填入build_boost.bat

4.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_0bash 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  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)
5.Mac OS X編譯環境

OS X Yosemite 10.10.3
Xcode 6.3.1(6D1002)
boost 1.57

步驟

和Linux相同。整合到Xcode的步驟和iOS類似。

轉載請註明出處:http://blog.csdn.net/hursing

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.