Boost 库全系统编译
2016-04-20 11:19
651 查看
转载:http://blog.csdn.net/hursing
boost自带一套编译工具bjam,bjam本身是跨平台的,并且也要自行编译出来。在boost目录下有bootstrap.sh和bootstrap.bat两个脚本分别用来编译*nix和windows下的bjam。bootstrap脚本可以传入参数,以在编译bjam过程中生成特定的编译boost的配置。这些配置保存在新生成的project-config.jam里,但还可以在运行bjam的时候再传入参数来覆盖。同时生成的b2是bjam的代理,运行哪个的效果都差不多。
在终端下运行
会列出所有要编译的库。
真正编译时,可以传入–with-xxx来选择编译哪些库,或者传入–without-xxx来选择不编译哪些库。如果不传则会读取project-config.jam的设置,如果也没有则是编译全部的库。
更多的参数可以用
来查看。例如编译成静态库还是动态库,运行时库是静态的还是动态的,编译完后要不要安装等。
注意:
旧版本的boost可能会存在编译问题,尽量用新的就好。bjam在*nix和windows支持的参数有不同。
Xcode 6.3.1(6D1002)。如果用Xcode 7在模拟器版链接失败,请参考评论区4楼里的解决方案!
boost 1.57/1.58
Phases->点击左边的+号->New Run Script Phase->填入bash ./build_boost.sh->自己再填好库文件搜索路径和链接各个boost库。主target还要设置依赖boost target,免得boost编译前就链接以致错误。
NDK r10c
boost 1.57/1.58
以下是编译四个库的Android.mk的内容:
Application.mk的内容:
这是最普通的做法,如果要加编译参数,还得自己琢磨下。例如不要rtti,就得
还是想用boost原生的编译方法的话,可参考这里 http://stackoverflow.com/questions/30491158/compile-and-use-boost-for-android-ndk-r10e
Visual Studio Ultimate 2013
boost 1.57/1.58
注意这里生成的是MTd和MT。MD的话runtime-link=shared。
还有设置好库搜索路径和依赖的库。
Windows的boost有个特点,代码里有
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
boost 1.57/1.58
这样就能在boost_1_57_0/stage/lib/下找到所有的库文件。
如果用cmake来组织编译,以下是主工程的CMakeLists.txt里的部分内容:
可留意
b2 -j10 cflags=-fPIC cxxflags=-fPIC cxxflags=-fvisibility=hidden cxxflags=-fvisibility-inlines-hidden cxxflags=-fexceptions cxxflags=-DBOOST_NO_RTTI
如果要传递多个cflags,需要重复键名,而不是加双引号把多个值赋给同一个。红色的部分是隐藏符号。
Xcode 6.3.1(6D1002)
boost 1.57/1.58
转载请注明出处:http://blog.csdn.net/hursing
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.3Xcode 6.3.1(6D1002)。如果用Xcode 7在模拟器版链接失败,请参考评论区4楼里的解决方案!
boost 1.57/1.58
步骤:
把下面的脚本保存成build_boost.sh,直接运行即可:<code class="language-bash hljs has-numbering"><span class="hljs-shebang">#!/bin/bash</span> <span class="hljs-comment"># http://blog.csdn.net/hursing/article/details/45439087</span> <span class="hljs-comment"># 请自行修改路径,cd到boost解压后的目录下</span> dir=`dirname <span class="hljs-variable">$0</span>` <span class="hljs-built_in">cd</span> <span class="hljs-string">"<span class="hljs-variable">$dir</span>/../../third_party/boost_1_57_0"</span> <span class="hljs-comment"># 如果库文件已存在,直接退出</span> <span class="hljs-keyword">if</span> [ <span class="hljs-operator">-e</span> ./stage/lib/libboost_date_time.a ]; <span class="hljs-keyword">then</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">"libraries exist. no need to build."</span> <span class="hljs-keyword">exit</span> <span class="hljs-number">0</span> <span class="hljs-keyword">fi</span> <span class="hljs-comment"># 以下代码参考 https://gist.github.com/rsobik/7513324 ,原文使用的boost版本比较旧,不能使用。</span> : <span class="hljs-variable">${COMPILER:="clang++"}</span> : <span class="hljs-variable">${IPHONE_SDKVERSION:=`xcodebuild -showsdks | grep iphoneos | egrep "[[:digit:]]+\.[[:digit:]]+" -o | tail -1`}</span> : <span class="hljs-variable">${XCODE_ROOT:=`xcode-select -print-path`}</span> : <span class="hljs-variable">${EXTRA_CPPFLAGS:="-DBOOST_AC_USE_PTHREADS -DBOOST_SP_USE_PTHREADS -stdlib=libc++"}</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">"IPHONE_SDKVERSION: <span class="hljs-variable">$IPHONE_SDKVERSION</span>"</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">"XCODE_ROOT: <span class="hljs-variable">$XCODE_ROOT</span>"</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">"COMPILER: <span class="hljs-variable">$COMPILER</span>"</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">"bootstrap"</span> <span class="hljs-comment"># 此脚本如果是被Xcode调用的话,会因为xcode export的某些变量导致失败,所以加了env -i。直接在命令行运行此脚本可以把env -i 去掉</span> env -i bash ./bootstrap.sh <span class="hljs-built_in">echo</span> <span class="hljs-string">"write project-config.jam"</span> <span class="hljs-comment"># 默认生存的project-config.jam是编译Mac版的,这里直接调换掉</span> rm project-config.jam cat >> project-config.jam <<EOF using darwin : <span class="hljs-variable">${IPHONE_SDKVERSION}</span>~iphone : <span class="hljs-variable">$XCODE_ROOT</span>/Toolchains/XcodeDefault.xctoolchain/usr/bin/<span class="hljs-variable">$COMPILER</span> -arch armv7 -arch arm64 <span class="hljs-variable">$EXTRA_CPPFLAGS</span> : <striper> <root><span class="hljs-variable">$XCODE_ROOT</span>/Platforms/iPhoneOS.platform/Developer : <architecture>arm <target-os>iphone ; using darwin : <span class="hljs-variable">${IPHONE_SDKVERSION}</span>~iphonesim : <span class="hljs-variable">$XCODE_ROOT</span>/Toolchains/XcodeDefault.xctoolchain/usr/bin/<span class="hljs-variable">$COMPILER</span> -arch i386 -arch x86_64 <span class="hljs-variable">$EXTRA_CPPFLAGS</span> : <striper> <root><span class="hljs-variable">$XCODE_ROOT</span>/Platforms/iPhoneSimulator.platform/Developer : <architecture>ia64 <target-os>iphone ; EOF <span class="hljs-comment"># 上面的代码里,两个using darwin分别是编译真机版和模拟器版的设置。每多一种CPU架构就要再加一个-arch xxx。</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">"build boost iphone dev"</span> ./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-<span class="hljs-variable">${IPHONE_SDKVERSION}</span> define=_LITTLE_ENDIAN link=static stage <span class="hljs-built_in">echo</span> <span class="hljs-string">"build boost iphone sim"</span> ./bjam -j16 --with-date_time --with-filesystem --with-system --with-thread --build-dir=iphonesim-build --stagedir=iphonesim-build/stage --toolset=darwin-<span class="hljs-variable">${IPHONE_SDKVERSION}</span>~iphonesim architecture=ia64 target-os=iphone macosx-version=iphonesim-<span class="hljs-variable">${IPHONE_SDKVERSION}</span> link=static stage <span class="hljs-built_in">echo</span> <span class="hljs-string">"lipo"</span> <span class="hljs-comment"># 把各架构下的库文件合一,以便在xcode里可以少设置些搜索路径。做得更彻底些是各个分库合成一个大库。不过除非是把静态库加入到代码仓库,否则是浪费时间了。要合成的大库话请参考https://gist.github.com/rsobik/7513324原文。</span> 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 <span class="hljs-comment"># 库文件最终放在./stage/lib/下</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">"Completed successfully"</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</l cec2 i><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li></ul>
集成到Xcode
做iOS的同学还是习惯完全用Xcode的吧。所以可以把上面的脚本集成到xcode里。在某个工程中,Xcode菜单File->New->Target…->Other->Aggregate->取名boost,Finish->在这个target的属性中选择BuildPhases->点击左边的+号->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 64bitNDK r10c
boost 1.57/1.58
步骤
想要哪个库,自己把那个库下的cpp文件加到mk里,都在libs/xxxx/下。如果在libs找不到,说明这个库是不需要额外编译的。以下是编译四个库的Android.mk的内容:
<code class="language-Android.mk hljs tex has-numbering">include <span class="hljs-formula">$(CLEAR_VARS) LOCAL_PATH := $</span>(ROOT_PATH)/third_party/boost_1_57_0 LOCAL_MODULE := boost <span class="hljs-special">#</span> 需要编译哪个库,自行把libs目录下的cpp加进来即可。 LOCAL_SRC_FILES += <span class="hljs-command">\ </span> libs/filesystem/src/path.cpp <span class="hljs-command">\ </span> libs/filesystem/src/path_traits.cpp <span class="hljs-command">\ </span> libs/filesystem/src/operations.cpp <span class="hljs-command">\ </span> libs/filesystem/src/codecvt_error_category.cpp <span class="hljs-command">\ </span> libs/filesystem/src/portability.cpp <span class="hljs-command">\ </span> libs/filesystem/src/utf8_codecvt_facet.cpp <span class="hljs-command">\ </span> <span class="hljs-command">\ </span> libs/date_time/src/gregorian/date_generators.cpp <span class="hljs-command">\ </span> libs/date_time/src/gregorian/greg_month.cpp <span class="hljs-command">\ </span> libs/date_time/src/gregorian/greg_weekday.cpp <span class="hljs-command">\ </span> libs/date_time/src/gregorian/gregorian_types.cpp <span class="hljs-command">\ </span> libs/date_time/src/posix_time/posix_time_types.cpp <span class="hljs-command">\ </span> <span class="hljs-command">\ </span> libs/system/src/error_code.cpp <span class="hljs-command">\ </span> <span class="hljs-command">\ </span> libs/thread/src/future.cpp <span class="hljs-command">\ </span> libs/thread/src/pthread/once.cpp <span class="hljs-command">\ </span> libs/thread/src/pthread/once_atomic.cpp <span class="hljs-command">\ </span> libs/thread/src/pthread/thread.cpp <span class="hljs-special">#</span> 如果要把boost集成到动态库里,-fPIC是必须的,不然会有链接错误。原因请自行Google LOCAL_CFLAGS += -fPIC -frtti -fexceptions include <span class="hljs-formula">$(BUILD_STATIC_LIBRARY)</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li></ul>
Application.mk的内容:
<code class="language-makefile hljs has-numbering"><span class="hljs-constant">APP_PLATFORM</span> := android-19 <span class="hljs-constant">APP_OPTIM</span> := release <span class="hljs-constant">APP_CFLAGS</span> += -Wall <span class="hljs-constant">APP_STL</span> := gnustl_static <span class="hljs-constant">APP_ABI</span> := armeabi-v7a</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>
这是最普通的做法,如果要加编译参数,还得自己琢磨下。例如不要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 SP1Visual Studio Ultimate 2013
boost 1.57/1.58
步骤
以下是build_boost.bat的内容,直接执行即可:<code class="language-bat hljs lasso has-numbering">cd <span class="hljs-built_in">..</span><span class="hljs-subst">\</span><span class="hljs-built_in">..</span><span class="hljs-subst">\</span>third_party<span class="hljs-subst">\</span>boost_1_57_0 <span class="hljs-keyword">if</span> <span class="hljs-literal">not</span> exist <span class="hljs-built_in">.</span><span class="hljs-subst">\</span>b2<span class="hljs-built_in">.</span>exe ( call <span class="hljs-built_in">.</span><span class="hljs-subst">\</span>bootstrap<span class="hljs-built_in">.</span>bat <span class="hljs-built_in">.</span><span class="hljs-subst">\</span>b2<span class="hljs-built_in">.</span>exe <span class="hljs-attribute">-j5</span> <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-date_time</span> <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-filesystem</span> <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-system</span> <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-thread</span> <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-regex</span> <span class="hljs-keyword">link</span><span class="hljs-subst">=</span>static runtime<span class="hljs-attribute">-link</span><span class="hljs-subst">=</span>static )</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>
注意这里生成的是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 64bitgcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
boost 1.57/1.58
步骤
直接编译。以下是终端命令<code class="language-shell hljs bash has-numbering"><span class="hljs-built_in">cd</span> boost_1_57_0 bash bootstrap.sh ./b2</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>
这样就能在boost_1_57_0/stage/lib/下找到所有的库文件。
如果用cmake来组织编译,以下是主工程的CMakeLists.txt里的部分内容:
<code class="language-cmake hljs has-numbering"><span class="hljs-keyword">include</span>(ExternalProject) ExternalProject_Add(boost SOURCE_DIR <span class="hljs-envvar">${ROOT_DIR}</span>/third_party/boost_1_57_0 CONFIGURE_COMMAND bash <span class="hljs-envvar">${ROOT_DIR}</span>/third_party/boost_1_57_0/bootstrap.sh --with-libraries=date_time,thread,filesystem,system <span class="hljs-keyword">BUILD_COMMAND</span> <span class="hljs-envvar">${ROOT_DIR}</span>/third_party/boost_1_57_0/b2 -j10 cflags=-fPIC cxxflags=-fPIC <font color=<span class="hljs-string">"red"</span>>cxxflags=-fvisibility=hidden cxxflags=-fvisibility-inlines-hidden</font> cxxflags=-fexceptions cxxflags=-DBOOST_NO_RTTI BUILD_IN_SOURCE <span class="hljs-number">1</span> INSTALL_COMMAND <span class="hljs-string">""</span> ) <span class="hljs-keyword">set</span>( BOOST_LIBRARIES <span class="hljs-envvar">${ROOT_DIR}</span>/third_party/boost_1_57_0/stage/lib/libboost_date_time.a <span class="hljs-envvar">${ROOT_DIR}</span>/third_party/boost_1_57_0/stage/lib/libboost_system.a <span class="hljs-envvar">${ROOT_DIR}</span>/third_party/boost_1_57_0/stage/lib/libboost_thread.a <span class="hljs-envvar">${ROOT_DIR}</span>/third_party/boost_1_57_0/stage/lib/libboost_filesystem.a ) <span class="hljs-comment"># ...</span> <span class="hljs-comment"># 下面是设置链接和依赖</span> <span class="hljs-keyword">target_link_libraries</span>(your_target <span class="hljs-envvar">${BOOST_LIBRARIES}</span>) <span class="hljs-keyword">add_dependencies</span>(your_target boost)</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li></ul>
可留意
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.3Xcode 6.3.1(6D1002)
boost 1.57/1.58
步骤
和Linux相同。集成到Xcode的步骤和iOS类似。转载请注明出处:http://blog.csdn.net/hursing
相关文章推荐
- 机器学习算法一览(附python和R代码)
- 如何下载WDK10【详见本文的中文注解】
- set 和hash_set和海量数据的处理问题
- 【转】Android 4.4前后版本读取图库图片和拍照完美解决方案
- 微信js sdk invalid signature签名错误
- 编译原理:用Flex和 Bison实现一个功能更为强大的计算器
- scala eclipse导入spark-assembly-1.6.0-hadoop2.6.0.jar工程出现红色叉
- Spring Boot application.propertis配置文件的相关通用属性
- HDU 1051
- session小结
- Android四大控件之BroadcastReceiver
- android依据区域高度切割文本问题
- servlet工作原理
- python网页爬虫
- ubuntu中怎样添加或删除一个PPA源
- 一.Android 控件架构
- django的session保存策略(时间)
- [bzoj2555]SubString
- MFC简单计算器
- 数据库解决字符集与乱码问题