小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Boost編譯方法

 9loong 2011-01-28
http://bujibuji2010.blog.sohu.com/154153377.html


方法一:

經(jīng)歷了將近半年多的時(shí)間boost終于發(fā)布了1.35.0版本(前版本1.34.1發(fā)布于2007/7),
其編譯方法和原來的編譯方法基本上是一致的,主要改變包括1.34.0以來bjam的toolset所
提供的參數(shù)名稱的改變(具體參見《boost1.34.0編譯日志》)外,還包括bjam的編譯默認(rèn)
選項(xiàng)的變化,在1.35.0之前的版本默認(rèn)編譯時(shí)會(huì)自動(dòng)編譯各種版本的庫,包括靜態(tài)庫、
動(dòng)態(tài)庫、debug庫和release庫等全部的版本,但是到了1.35.0時(shí)默認(rèn)的選擇僅僅編譯release
版本的庫,這樣一來在開發(fā)的時(shí)候就不能進(jìn)行必要的調(diào)試了,為了能夠使其編譯全部的版本
需要在bjam的命令行參數(shù)中添加一個(gè)--build-type=complete類型的參數(shù)來指明需要編譯全
部的版本,所需要編譯同時(shí)為了使得regex庫能夠通過ICU庫支持Unicode,在編譯上需要有
一些特殊的選擇。我在Visual Studio 2005 Pro + SP1環(huán)境下編譯了該庫,為了避免走彎路
所以將其編譯的方法進(jìn)行說明,以方便大家編譯。
    由于boost是采用其自己的bjam工具通過命令行進(jìn)行編譯的,所以必須在Windows下開啟console窗口,同時(shí)必須將Visual Studio中C++目錄下的環(huán)境vcvarsall.bat配置腳本運(yùn)行一遍,以設(shè)置好VC的編譯器環(huán)境變量。
    1. 編譯不帶ICU支持的boost庫
       此種情況下的boost庫編譯起來比較的簡(jiǎn)單,在準(zhǔn)備好的console窗口中輸入:
           bjam --without-python --toolset=msvc-8.0 --build-type=complete stage
       就可以了,如果要安裝的話則輸入:
           bjam --without-python --toolset=msvc-8.0 --build-type=complete install
          
    2. 編譯具有ICU支持的boost庫
       首先我們必須編譯ICU庫才能夠編譯boost庫,在準(zhǔn)備好的console窗口中輸入:
           bjam -sICU_PATH=d:\ICU --without-python --toolset=msvc-8.0 --build-type=complete stage
       就可以了,如果要安裝的話則輸入:
           bjam -sICU_PATH=d:\ICU --without-python --toolset=msvc-8.0 --build-type=complete install
    通過上面的方法可以很正常完成boost各種需要版本的關(guān)系。

每次用bjam編譯boost總是要查看幫助文件才行。
雖然現(xiàn)在的bjam編譯命令只有兩三個(gè)參數(shù),可是不小心還是會(huì)錯(cuò)。

1. toolset參數(shù)中,試圖用vc,正確的應(yīng)該是msvc。
vc用于庫文件的命名后綴中。兩個(gè)名字能統(tǒng)一就好了。

2. 編譯工具的版本號(hào)應(yīng)該用點(diǎn)號(hào)分隔,并且總是應(yīng)該指定該版本號(hào)。
如msvc-71是錯(cuò)誤的,應(yīng)該用msvc-7.1。
小版本號(hào)不能省,如msvc-6.0不能寫成msvc-6。
版本號(hào)指定錯(cuò)誤,可能也能編譯,但是生成庫的名字是錯(cuò)的。

3. 使用stlport。
要在user-config.jam中配置stlport,
例如:using stlport : : F:\STLport-5.1.0\stlport F:\STLport-5.1.0\lib ;
并且別忘了在參數(shù)中加上參數(shù):--stdlib=stlport。
user-config.jam中的stlport配置可以一直保持開啟,
因?yàn)樽罱K是由stdlib參數(shù)決定是否使用stlport。

方法二:

1.點(diǎn)擊 開始->程序->Microsoft Visual Studio 2005->Visual Studio Tools->Visual Studio 2005 命令提示
2.cd D:\Libs\boost_1_35_0\tools\jam\src
3.build.bat
 此時(shí)在src\bin.ntx86\目錄下產(chǎn)生了bjam.exe
4.將bjam.exe拷貝到boost的根目錄D:\Libs\boost_1_35_0
5.cd D:\Libs\boost_1_35_0
6.bjam.exe --build-dir=build --toolset=msvc stage
 
 編 譯完成后,產(chǎn)生了2個(gè)目錄build和stage,但同時(shí)也發(fā)現(xiàn)一個(gè)奇怪問題:stage里面的文件,竟然有很多相同的lib,比如 boost_date_time-vc80-mt-1_35.lib和boost_date_time-vc80- mt.lib,boost_filesystem-vc80-mt-1_35.lib和boost_filesystem-vc80-mt.lib他們文 件的大小一樣,只是文件名稍微不同,一個(gè)帶有版本號(hào),另一個(gè)沒有。編譯的問題,還是boost本身有

方法三:

 一、下載安裝:

  下載boost 1.31,解壓縮至一個(gè)文件夾,本文以[boost-path]來引用這個(gè)路徑。

  二、編譯準(zhǔn)備工作:

  首先是編譯jam,在< boost-path >\tools\build\v1下,把vc7.1-tools.jam文件復(fù)制一份,改名為vc80-tools.jam,我暫時(shí)未測(cè)試stl-port。

  修改文件內(nèi)容里的路徑,這個(gè)根據(jù)你的安裝路徑來改。去掉幾個(gè)flag行,以后編譯時(shí)就少一些警告。修改以后內(nèi)容如下:

extends-toolset msvc ;

# singleton variables...
set-as-singleton VC80_ROOT ;

if ! $(MSVCDir)
{
ProgramFiles ?= $(PROGRAMFILES) ;
VC80_ROOT ?= $(ProgramFiles:J=" ")\\Microsoft Visual Studio 8\\VC" ;
VC_TOOL_PATH = "$(VC80_ROOT)\\bin\\ ;
VC_SETUP = "CALL \"$(VC_TOOL_PATH)VCVARS32.BAT\" >nul" ;
}
VC_PDB_NAME = vc80 ;
flags vc80 C++FLAGS on : /Zc:wchar_t ;

  然后打開VC2005程序組里面的Visual Studio Command Prompt,這能確保已加載環(huán)境變量,減少后面一些操作過程。在[boost-path]\tools\build\jam-src目錄下運(yùn)行:

build -sTOOLS=vc80

  編譯會(huì)通過的,最后鏈接時(shí)會(huì)報(bào)錯(cuò),之后想到的方法如下:

.\bootstrap.vc7\jam0 -f build.jam --toolset=vc7 "--toolset-root=C:\Program Files\Microsoft Visual Studio 8\VC"

  注:這個(gè)選項(xiàng)不能直接附加在build批處理后面,所以要這樣調(diào)用。

  好了,bjam編譯完成。下面編譯boost,有2個(gè)文件需要改一下:

  [boost-path]\boost\config\auto_link.hpp在第118行附近改為:

#elif defined(BOOST_MSVC) && (BOOST_MSVC == 1310)

// vc71:
# define BOOST_LIB_TOOLSET "vc71"

#elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1400)

// vc80:
# define BOOST_LIB_TOOLSET "vc80"

  注:如果你不修改這里,那么后面測(cè)試時(shí)無法鏈接到正確的lib,因?yàn)榍懊嫖覀円呀?jīng)使用了“VC.NET 2005”,生成的lib全是VC.NET 2005的。

  [boost-path]\boost\config\compile\visualc.hpp最后面的>1310改為1400,如下:

#if (_MSC_VER?> 1400)

  注:如果不修改這個(gè),無法正確生成所需要的lib。

  這些文件修改就完成了。如果你需要boost-python,那么還需設(shè)置幾個(gè)環(huán)境變量,注意路徑替換為你自己的,版本號(hào)只留前2位,比如2.3.4,則只需要寫上2.3。

SET PYTHON_ROOT=c:\soft\python24
SET PYTHON_VERSION=2.4
SET PYTHON_LIB_PATH=c:\soft\python24\libs

  三、編譯:

  以上過程都完畢了,現(xiàn)在轉(zhuǎn)到[boost-path]目錄下,運(yùn)行如下命令:

tools\build\jam_src\bin.ntx86\bjam -sTOOLS=vc80 "-sBUILD=debug release static/dynamic single/multi"

  編譯完成以后,設(shè)置VC2005的include和lib路徑,最好搜索一下*.lib,拷到一個(gè)文件夾下,接下來就可以測(cè)試了。

  四、測(cè)試:

  寫了一段測(cè)試正則表達(dá)式的代碼,編譯、鏈接,結(jié)果是報(bào)錯(cuò)。原來是要鏈接多線程版本!在VC2005里找了一下,發(fā)現(xiàn)只有多線程選項(xiàng),單線程竟然沒有列進(jìn)來。

  這中間我走了一點(diǎn)彎路,試圖編譯一個(gè)多線程版本的boost,結(jié)果發(fā)現(xiàn)不行,編譯出來還是單線程的,就線程庫是多線程版本。

  最后用了個(gè)蠢辦法:在#include < stdafx.h >后面加上一句:#undef _MT,終于可以運(yùn)行起來了。

  五、補(bǔ)充說明:

  如果系統(tǒng)中有MSVCDir 這個(gè)環(huán)境變量,VC80_ROOT這個(gè)變量將會(huì)被忽略掉。由于vc2005對(duì)C++的標(biāo)準(zhǔn)庫增加了更嚴(yán)格的安全性檢測(cè),所以在VC2005里使用 boost會(huì)得到很多假的警告,可以通過定義 _SCL_SECURE_NO_DEPRECATE 或者加入#pragma warning(disable:4996)來處理掉,另外一些是因?yàn)槟承├系腃庫函數(shù)被VC2005聲明為deprecated(不贊成使用的),例如 fopen, str*字符串函數(shù)等。

方法四:

boost庫是一個(gè)跨平臺(tái)的C++庫,因此它的安裝多少有些麻煩——如果你需要使用那些必須編譯的庫的時(shí)候。在windows平臺(tái)上(使用 VS2003和VS2005)最簡(jiǎn)單的辦法就是從 http://www./download/windows?下載boost庫的installer,使用它可 以指定安裝基于哪個(gè)開發(fā)環(huán)境的庫,每個(gè)庫安裝那些版本,非常方便,免去了配置編譯之苦。

編譯了一個(gè)使用正則表達(dá)式庫regex的控制臺(tái)應(yīng)用程序,設(shè)定好包含目錄和庫目錄后,發(fā)現(xiàn)最后鏈接失敗,提示:LINK : fatal error LNK1104: 無法打開文件“libboost_regex-vc80-mt-gd-1_34_1.lib”。使用boost庫不需要在工程設(shè)置中顯式的指定庫名字,而 是由boost自身來完成這個(gè)設(shè)定的。由于boost庫跨平臺(tái)并且支持多個(gè)編譯環(huán)境,因此這個(gè)被鏈接庫文件的文件名是根據(jù)當(dāng)前編譯的配置動(dòng)態(tài)生成的。 boost_regex是庫的基本名稱,vc80是編譯環(huán)境,mt表示這是一個(gè)多線程庫,gd表示包含調(diào)試信息,最后的1_34_1是版本號(hào)。檢查安裝后 的庫文件,發(fā)現(xiàn)有的是boost_regex-vc80-mt-gd-1_34_1.lib,所以很明顯,在庫名生成的過程中出現(xiàn)了問題,多了一個(gè) “lib”前綴。

打開boost/regex.hpp,繼續(xù)打開boost/regex/config.hpp文件,最終可以發(fā)現(xiàn)動(dòng)態(tài)鏈接配置的功能是由boost /config/auto_link.hpp統(tǒng)一實(shí)現(xiàn)的。在這個(gè)文件開頭的注釋里詳細(xì)說明了使用方式,相信這種方式對(duì)我們自己的庫開發(fā)也很有裨益。這里提 到了名稱的構(gòu)造公式:

BOOST_LIB_PREFIX
   + BOOST_LIB_NAME
   + "_"
   + BOOST_LIB_TOOLSET
   + BOOST_LIB_THREAD_OPT
   + BOOST_LIB_RT_OPT
   "-"
   + BOOST_LIB_VERSION

根據(jù)我們的錯(cuò)誤,我們應(yīng)該檢查BOOST_LIB_PREFIX的值為什么是“lib”而不是空的。通過搜索,發(fā)現(xiàn)

#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)
#? define BOOST_LIB_PREFIX
#elif defined(BOOST_DYN_LINK)
#? error "Mixing a dll boost library with a static runtime is a really bad idea..."
#else
#? define BOOST_LIB_PREFIX "lib"
#endif

現(xiàn)在終于清楚了,我們應(yīng)該在工程設(shè)置中加入_DLL定義或者_(dá)RTLDLL定義,并且指定boost庫采用動(dòng)態(tài)連接,定義BOOST_DYN_LINK。在工程設(shè)置中加入_DLL;BOOST_DYN_LINK,鏈接就通過了。

方法五:

這幾天寫代碼需要序列化自定義類,類的定義可以抽象為vector<vector<T> >。我本想通過重載operator<<和operator>> 來實(shí)現(xiàn)序列化。但是寫入是寫入了,讀就讀不出來了。在讀完第一個(gè)對(duì)象之后istream的tellg()返回了-1,導(dǎo)致后續(xù)的對(duì)象無法讀取。后來我使用 boost很方便的就完成了序列化的工作。但是我使用的編譯環(huán)境是VC9,boost還沒有針對(duì)vc9的編譯設(shè)置,所以編譯安裝還是花了點(diǎn)時(shí)間。

針對(duì)VC9,下載的boost需做如下修改:(+為需增加的行,)

文件 msvc.jam

@@ -231,6 +231,10 @@ local rule configure-really (
         {
             # Even if version is not explicitly specified, try to detect the version
             # from the path.
+            if [ MATCH "(Microsoft Visual Studio 9.0)" : $(command) ]
+            {
+                version = 9.0 ;
+            }                
             if [ MATCH "(Microsoft Visual Studio 8)" : $(command) ]
             {
                 version = 8.0 ;
@@ -913,13 +916,14 @@ actions compile.mc

 .ProgramFiles = [ path.make [ common.get-program-files-dir ] ] ;

-.known-versions = 8.0 8.0express 7.1 7.1toolkit 7.0 6.0 ;
+.known-versions = 9.0 9.0express 8.0 8.0express 7.1 7.1toolkit 7.0 6.0 ;

 # Version aliases
 .version-alias-6 = 6.0 ;
 .version-alias-6.5 = 6.0 ;
 .version-alias-7 = 7.0 ;
 .version-alias-8 = 8.0 ;
+.version-alias-9 = 9.0 ;

 # Name of the registry key that contains Visual C++ installation path
 #   (relative to "HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft"
@@ -928,6 +932,8 @@ actions compile.mc
 .version-7.1-reg = "VisualStudio\\7.1\\Setup\\VC" ;
 .version-8.0-reg = "VisualStudio\\8.0\\Setup\\VC" ;
 .version-8.0express-reg = "VCExpress\\8.0\\Setup\\VC" ;
+.version-9.0-reg = "VisualStudio\\9.0\\Setup\\VC" ;
+.version-9.0express-reg = "VCExpress\\9.0\\Setup\\VC" ;

 # Visual C++ Toolkit 2003 do not store its installation path in the registry.
 # The environment variable 'VCToolkitInstallDir' and the default installation

文件 auto_link.hpp

line133開始改成:

#elif defined(BOOST_MSVC) && (BOOST_MSVC == 1400)
 
 // vc80:
#  define BOOST_LIB_TOOLSET "vc80"
 
#elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1500)
 
 // vc90:
#  define BOOST_LIB_TOOLSET "vc90"

#elif defined(__BORLANDC__)

文件 visualc.hpp

#error "Compiler not supported or configured - please reconfigure"
 #endif
 //
-// last known and checked version is 1400 (VC8):
-#if (_MSC_VER > 1400)
+// last known and checked version is 1500 (VC9):
+#if (_MSC_VER > 1500)
 #  if defined(BOOST_ASSERT_CONFIG)
 #     error "Unknown compiler version - please run the configure tests and report the results"
 #  else


然后就可以編譯了,但是在編譯過程中會(huì)有很多的warning C4819: The file contains a character that cannot be represented in the current code page (936). 原因是boost源代碼的注釋中有很多非low ASCII的字符,都是人名和版權(quán)注釋。在編譯boost庫時(shí)可以不管,但是在編譯包含了boost的頭文件的項(xiàng)目時(shí)卻很煩人??梢栽趐roject properties,   C/C++,    Advanced,   Disable Specific warnings中填入4819關(guān)閉這個(gè)警告。

VS2005中     error       LNK2019:       無法解析的外部符號(hào)       _WinMain@16       ,該符號(hào)在函數(shù)       _WinMainCRTStartup       中被引用。

本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/huangjack_1/archive/2008/10/14/3073575.aspx

boost庫使用了一種自動(dòng)鏈接技術(shù),通過分析編譯器設(shè)定的工程選項(xiàng)自動(dòng)選擇庫進(jìn)行鏈接。例如:
    新建一個(gè)VC工程,右擊項(xiàng)目,選擇屬性->配置屬性->C/C++->代碼生成->運(yùn)行時(shí)庫。如果選擇非動(dòng)態(tài)鏈接庫(MT, MTD),boost自動(dòng)鏈接對(duì)應(yīng)的靜態(tài)庫,否則(MD, MDD)會(huì)鏈接動(dòng)態(tài)庫,用戶在在鏈接選項(xiàng)中手動(dòng)設(shè)置的boost庫被忽略。
具體鏈接的庫名也是有boost\config\auto_link.hpp中的預(yù)編譯宏自動(dòng)生成,如果發(fā)現(xiàn)boost鏈接了不正確的庫,應(yīng)該仔細(xì)分析該文件。
    總之,配置boost項(xiàng)目的庫鏈接不是通過配置鏈接器,而是通過編譯器的預(yù)編譯選項(xiàng)和預(yù)編譯宏實(shí)現(xiàn)的。
    再舉一個(gè)例子:使用VC編譯boost相關(guān)工程常見的一個(gè)錯(cuò)誤是,選擇MDD庫編譯時(shí),報(bào)找不到boost庫的錯(cuò)誤,分析auto_link.hpp可知,在MDD選項(xiàng)打開時(shí),預(yù)編譯宏_DLL被設(shè)置,在auto_link.hpp的294行有如下代碼:
#if ((defined(_DLL) || defined(_RTDLL))) && defined(BOOST_DYN_LINK)
#define BOOST_LIB_PREFIX
#elif defined(BOOST_DYN_LINK)
#error "Mixing a dll boost library with a static runtime is a really bad idea..."
#else
#define BOOST_LIB_PREFIX "lib"
#endif
由于BOOST_DYN_LINK未設(shè)置,導(dǎo)致庫名前綴宏BOOST_LIB_PREFIX被定義為"lib",而boost動(dòng)態(tài)鏈接庫的庫名默認(rèn)是沒有l(wèi)ib前綴的,如是會(huì)導(dǎo)致上述鏈接錯(cuò)誤。只要在編譯器預(yù)編譯頭中定義宏BOOST_DYN_LINK即可解決該問題

一個(gè)link error
error LNK2001: unresolved external symbol __imp___assert
You may be using /MTd (Debug Multithreaded), which could explain this link error.
When you build and link your static library, I recommend you use /MDd [debug] or /MD [release], which means use the DLL runtime libraries.

關(guān)于STLport
首先應(yīng)該定義:
#define __STL_DEBUG
但由于用了STLport,會(huì)鏈接 boost_regex-vc80-mt-gdp-1_41.lib(不用STLport時(shí)是boost_regex-vc80-mt-gd- 1_41.lib)。boost_regex-vc80-mt-gdp-1_41.lib在boost的lib目錄下沒有,如果非得使用STLport, 可以想到的有兩種辦法:
1)將boost的lib目錄下的boost_regex-vc80-mt-gd-1_41的lib和dll復(fù)制一份出來改成boost_regex-vc80-mt-gdp-1_41的lib和dll。這種方法又會(huì)引入很多新的link error
2)將STLport下的stlportd.5.1的lib和dll拷貝出來,放入當(dāng)前工程目錄下,程序聲明中加上:
#pragma comment(lib, "stlportd.5.1.lib")

由于boost庫默認(rèn)是靜態(tài)鏈接的,因此要加入聲明:
#define BOOST_ALL_DYN_LINK
#define BOOST_LIB_DIAGNOSTIC

一個(gè)測(cè)試程序:
#define BOOST_ALL_DYN_LINK
#define BOOST_LIB_DIAGNOSTIC
#define __STL_DEBUG
#pragma comment(lib, "stlportd.5.1.lib")

#include <cstdlib>
#include <stdlib.h>
#include <boost/regex.hpp>
#include <string>
#include <iostream>

using namespace boost;
using namespace std;

regex expression("^select ([a-zA-Z]*) from ([a-zA-Z]*)");

int main(int argc, char* argv[]){
 std::string in;
 cmatch what;
 cout << "enter test string in the from of select aaa from bbb:" << endl;
 getline(cin,in);
 if(regex_match(in.c_str(), what, expression)){
  for(int i=0;i<what.size();i++)
   cout<<"str :"<<what[i].str()<<endl;
 }
 else{
  cout<<"Error Input"<<endl;
 }
 return 0;
}

 

本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/sptoor/archive/2009/12/03/4933863.aspx

(#)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多