作者:
Caesar08 (Caesar)
2016-02-16 23:36:24前言:
會寫這篇文章是因為網路上的資料零零散散的
所以寫一篇文章分享給各位(也給未來的自己)
這篇文章會講到b2.exe的參數部分
作業系統:windows
編譯器:Visual C++ 14.0(Visual Studio 2015)
正文開始:
首先,先去boost的官網下載最新的lib,http://www.boost.org/users/download/
目前(2016/2/16)最新版本是1.60.0(所以底下都用boost_1_60_0),下載好記得解壓縮
裡面會看到bootstrap.bat,他是一個用來產生b2.exe與bjam.exe的檔案
(版本1.47.0以前,只有bjam.exe;版本1.47.0以後,bjam.exe改名為b2.exe)
(現在的bjam.exe是b2.exe的複製版本,兩個是一樣的,但bjam.exe為了與以前相容而存在)
執行bootstrap.bat
在boost裡面,有些library是header-only(只要是class template),有些不是(如:thread)
因此只要使用這些非header-only的檔案,就要把那些.cpp檔也放入編譯
但是每次都這樣編譯實在很花時間,這些檔案都是不會被更改的,那不如就先把他做成.lib(static link library)或.dll(dynamic link library)
讓user之後不用編譯這些不會動的library
因此,就要開始介紹如何製作這些.lib或.dll
調整編譯器參數
你需要先知道編譯器版本,像我是Visual C++ 14.0
(如果不知道版本,維基百科有提供協助https://goo.gl/fhIKnR,或在維基百科上搜尋visual c++)
打開boost_1_60_0/project-config.jam(註),裡面有一行
using msvc ;
你要改成
using msvc : 14.0 ;
^ ^ ^ 一定要有空格
(如果你電腦只有一個編譯器,實際上可以不用填)
如果你的visual studio不是安裝在預設路徑,那你可能需要指定路徑,因此要改成
using msvc : 14.0 : "D:/your/path/to/cl.exe" ;
路徑中如果有空格(如:D:/my boost),要用"包起來,並且用/來表示路徑(不然就用\\)
(cl.exe是visual c++的編譯器)
如果你有特別的參數想要給compiler,例如說你希望它只有在編譯c++ code時做optimize,那你就要改成
using msvc : 14.0 : : <cxxflags>"/Od /Ox" ;
^ 因為我用預設路徑,所以可以不填任何值
cxxflags是專門針對的C++做處理,如果想對所有語言做處理,可以使用<compileflags>
/Od /Ox是cl.exe的optimize options,別忘記用"包起來
當你的b2.exe的variant使用release時,預設是使用/O2,如果你想用/Ox,你需要先用/O
d把/O2關起來,再使用/Ox
關於更多using的設定可參考http://goo.gl/RYZRWt
而cl.exe參數可參考https://goo.gl/07qCDd,或搜尋visual c++ compiler options
註:不使用user-config.jam是因為它在boost_1_60_0/tools/build/example裡面,我懶得移動它
準備b2.exe參數
b2.exe就是實際上產生.lib或.dll的檔案,接下來會介紹參數,每一個參數的第一個就是預設值
address-model:32, 64
要產生32或64位元的code
architecture:x86, ia64, sparc, power, mips1, mips2, mips3, mips4, mips32, mips32r2, mips64, parisc, arm, combined, combined-x86-power
因為沒有amd64可以選,所以應該大部分人都會選x86
link:shared, static
shared會產出.dll,static會產出.lib
runtime-link:shared, static
shared會用dynamic的run-time library(visual c++的/MD)
static會用static的run-time library(visual c++的/MT)
建議使用shared(default)
target-os:
預設值是你現在使用的os(像我是windows,它就會產出給windows用的library)
如果你想要編譯給別的os用的library,你可以給這些參數aix, bsd, cygwin, darwin, freebsd, hpux, iphone, linux, netbsd, openbsd, osf, qnx, qnxnto, sgi, solaris, unix, unixware, windows
threading:single, multi
建議選擇multi,因為你不使用thread並不代表你用的library不使用thread
toolset:
像我的編譯器是visual c++,所以我會填msvc-14.0(因為我要用14.0的版本)
variant:debug, release, profile
debug會包含debug-symbols與runtime-debugging
release會包含optimization與inlining
profile會包含debug-symbols與optimization與inlining
debug-symbols:on, off
建議交給variant設定就好
runtime-debugging:on, off
建議交給variant設定就好