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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

整合到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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Application.mk的內容:

APP_PLATFORM := android-19
APP_OPTIM := release
APP_CFLAGS += -Wall
APP_STL := gnustl_static
APP_ABI := armeabi-v7a
  • 1
  • 2
  • 3
  • 4
  • 5

這是最普通的做法,如果要加編譯引數,還得自己琢磨下。例如不要rtti,就得LOCAL_CFLAGS += -DBOOST_NO_RTTI

4.Windows平臺編譯

環境

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

步驟

方法 1.

方法1親測,是OK的。--stagedir 可以不寫,用預設的就OK.我用的是VS 2017.

bjam stage --toolset=msvc-14.1 architecture=x86 address-model=64 --build-type=complete --without-graph --without-graph_parallel --stagedir="D:\boost\boost_1_63_0\bin\vc14-x64" link=static runtime-link=shared runtime-link=static threading=multi debug releaseaddress-model=64 表示生成x64位的庫;去掉此引數,預設值表示生成x86的庫。親測,在64位機,去掉architecture, address-model引數,toolset改為msvc-14.0, 編譯同時得出32位、64位的庫。

方法 2.

以下是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
)
  • 1
  • 2
  • 3
  • 4
  • 5

注意這裡生成的是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
  • 1
  • 2
  • 3

這樣就能在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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

可留意 
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和bootstrap.bat兩個指令碼分別用來編譯*nix和windo

boost平臺編譯方法

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

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影象編解

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

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

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

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

Cocos2d-x 3.0 打造一個平臺概念文件夾

android cocos2d www 全平臺 -s http 概念 1-1 style Cocos2d-x 3.0 打造一個全平臺概念文件夾http:// www.eoeandroid.com/thread-328055-1-1.html Cocos2d

如何為Android平臺編譯 opencv3 和 opencv_contrib (Linux)

gre inter jni fuzzy dnn letter ott esc lis p { margin-bottom: 0.1in; direction: ltr; color: rgb(0, 0, 10); line-height: 120%; text-align:

cocos多平臺編譯

cocos多平臺編譯cocos多平臺編譯

jsoncpp linux平臺編譯和arm移植

clas inux sta 編譯 動態 cpp 取出 dir 沒有 下載 http://sourceforge.net/projects/jsoncpp/ 或者 http://download.csdn.net/detail/chinaeran/8631141 Linux平

Windows10平臺編譯ffmpeg 4.0.2,生成ffplay

ini 枯燥 目錄 winsock pos 高效率 src pip .gz Windows10平臺編譯ffmpeg 4.0.2,生成ffplay 最近想研究下ffplay的代碼,學習代碼是枯燥無味的,也是抽象的,學習一個系統或者軟件之前,好的入門方法是先把系統搭建起來,或者

linux平臺編譯opencv

all home 2.4 2.4.1 docs com mpi mage lease 參考博客: https://www.pyimagesearch.com/2016/07/11/compiling-opencv-with-cuda-support// https://do

【makefile】多平臺編譯以及makefile自動化編譯總結

Date: 2018.9.30 1、前言     同一套庫程式碼往往需要在不同體系架構或系統上的機器和裝置上編譯和執行,這就需要我們熟悉不同平臺上的編譯方法以及測試方法,本文旨在講述多平臺編譯方法以及makefile自動化編譯的總結。 2、多平臺編譯之Windows平臺

多多客將逐步支持百度、支付寶小程序、H5、APP等,打造國內首家平臺綜合開發服務平臺

開源 小程序開發 微信小程序 重磅消息 多多客小程序自發布以來,以可視化拖拽、N+營銷應用、海量行業模板等優勢備受商家和開發者青睞。隨著支付寶、百度、抖音等頭部APP接連布局小程序,以及青否服務的客戶中對H5、APP的持續需求。多多客將從微信小程序第三方平臺到逐步支持百度智能