1. 程式人生 > >boost全平臺編譯方法

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編譯前就連結以致錯誤。
xcode的target設定

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

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類似。

相關推薦

boost平臺編譯方法

1.通用規則 多數庫是不需要預先編譯的,include hpp檔案就能用。如果出現連結失敗,那就是可能需要編譯庫了。 boost自帶一套編譯工具bjam,bjam本身是跨平臺的,並且也要自行編譯出來。在boost目錄下有bootstrap.sh和bootst

boost 平臺編譯

1.通用規則多數庫是不需要預先編譯的,include hpp檔案就能用。如果出現連結失敗,那就是可能需要編譯庫了。boost自帶一套編譯工具bjam,bjam本身是跨平臺的,並且也要自行編譯出來。在boost目錄下有bootstrap.sh和bootstrap.bat兩個指令碼分別用來編譯*nix和windo

android平臺編譯ffmpeg以及x264與fdk-aac實踐

目錄 編譯環境 單獨編譯完整功能ffmpeg庫 開始編譯x264庫 開始編譯fdk-aac庫 ffmpeg混合編譯x264和fdk-aar庫 編譯環境 作業系統:ubuntu 16.05 android-ndk-r10e 注意 這

android平臺編譯ffmpeg支援命令列實踐

本例基於 android全平臺編譯ffmpeg合併為單個庫實踐 進行的 目錄 環境準備 新建cmd工程 修改原始檔 執行輸出 環境準備 作業系統 ubuntu 16.05 編譯準備好libffmpeg庫和需要include標頭檔案,我們

android平臺編譯ffmpeg視訊推流實踐

ffmpeg實踐學習 android全平臺編譯ffmpeg以及x264與fdk-aac實踐 ubuntu下使用nginx和nginx-rtmp-module配置直播推流伺服器 android全平臺編譯ffmpeg合併為單個庫實踐 android-studio

android平臺編譯ffmpeg視訊解碼器實踐

目錄 配置環境 新建decode工程 配置環境 作業系統: ubuntu 16.05 注意: ffmpeg庫的編譯使用的是android-ndk-r10e版本,使用高版本編譯會報錯 而android-studio工程中配合cmake使用的版本則是a

android平臺編譯ffmpeg合併為單個庫實踐

目錄 編譯環境 配置config.sh指令碼 配置合併指令碼build_ffmpeg_merge.sh 指令碼地址 編譯環境 作業系統:ubuntu 16.05 android-ndk-r10e 注意 這裡如果使用高版本比如androi

android平臺編譯libyuv庫實現YUV和RGB的轉換

音視訊實踐學習 android全平臺編譯ffmpeg以及x264與fdk-aac實踐 ubuntu下使用nginx和nginx-rtmp-module配置直播推流伺服器 android全平臺編譯ffmpeg合併為單個庫實踐 android-studio使用c

android平臺編譯libpng並基於ANativeWindow載入PNG圖片

圖形影象實踐 android全平臺編譯libjpeg-turbo並基於ANativeWindow載入JPEG圖片 android全平臺編譯libpng並基於ANativeWindow載入PNG圖片 環境配置 作業系統:ubuntu 16.05 ndk版本:

android平臺編譯libjpeg-turbo並基於ANativeWindow載入JPEG圖片

圖形影象實踐 android全平臺編譯libjpeg-turbo並基於ANativeWindow載入JPEG圖片 android全平臺編譯libpng並基於ANativeWindow載入PNG圖片 概述 libjpeg - turbo是一個JPEG影象編解

Win32 平臺 Boost編譯方法

Win32 平臺 Boost 的編譯方法 本文以 boost1.40 為例,在 Win32 平臺的程式設計環境為 vs2005 ,假設 Boost 程式碼在 E:/opensource/boost_1_40_0 目錄,步驟如下。 1. 獲得 bjam 獲得 bja

Linux平臺Boost編譯方法

Linux平臺Boost的編譯方法 Boost的編譯使用的不是已經成為公認標準的make,而是專門為Boost開發的工具bjam(boost jam)。 本文以boost1.40為例,在Linux平臺的程式設計環境為gcc4.4.1,假設Boost程式碼在/usr

Windows 和 android 平臺Boost編譯方法

import os ;       if [ os.name ] = CYGWIN || [ os.name ] = NT {   androidPlatform = windows-x86_64 ;   }   else if [ os.name ] = LINUX {   androidPlatform

04志R58平臺編譯核心需要選擇的配置(Android4.4.2)

04全志R58平臺編譯核心需要選擇的配置 2018/11/6 14:19 版本:V1.0 開發板:SC5806 1、系統編譯:(略) 每次系統編譯/核心的時候都需要選3次N:   *   * Xtables matches   *

MTK平臺編譯userdebug版本開啟串列埠log方法

1.在lk中,進入目錄: vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c 在這個檔案中,找到以下ifdef USER_BUILD位置(有兩處),進行修改: #ifdef USE

編譯Android下可用的平臺FFmpeg(包含libx264與libfdk-aac)

原始碼或工具版本: ndk :r14FFmpeg 版本:3.2.5libfdk-aac 版本:0.1.5 一、原始碼準備: 這裡假設你已經擁有了ndk環境,沒有的可以先配置,可以參考Android下玩JNI的新老三種姿勢。 二、編寫全平臺指令碼: ffmpe

將專案的平臺由32位改為64位:VS2013修改編譯平臺方法

[摘要:之後果為念見地一下64位的sizeof,以是設定裝備擺設vs為64位的編譯仄臺,方式以下: 1、左鍵工程--屬性 面擊左上角的 設定裝備擺設治理器 2、找到對應的專案,正在仄臺一欄傍邊面擊下推,若是已有6] 之前因為想見識一下64位的sizeof,所以配置vs為6

SQLite3原始碼在Windows及WinCE平臺下的編譯方法

把原始碼下下來(第一項便是),上面有這麼一句話:This ZIP archive contains all C source code for SQLite 3.7.6.2 combined into a single source file (the amalgama

32位到64位:VS2013修改編譯平臺方法

配置vs為64位的編譯平臺,方法如下: 1、右鍵工程--屬性 點選右上角的配置管理器 2、找到對應的專案,在平臺一欄當中點選下拉,如果已經有64位平臺,那麼選擇即可;如果沒有,點選新建。 3、新建一個64位的平臺,選擇之,一路確認。然後再編譯就會顯示x

Boost編譯方法

方法一: 經歷了將近半年多的時間boost終於釋出了1.35.0版本(前版本1.34.1釋出於2007/7),其編譯方法和原來的編譯方法基本上是一致的,主要改變包括1.34.0以來bjam的toolset所提供的引數名稱的改變(具體參見《boost1.34.0編譯日誌》)外,