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

分享

VC++2010下編譯STLport,Boost

 win2zhang 2014-12-20

VC++2010下編譯STLport,Boost

最近在想向Boost轉(zhuǎn)移,努力掌握Boost代碼的過程中,

STLport版本:5.2.1

Boost版本:1.4.6.1 (1.4.7.0也OK)

編譯器Visual Studio 2010

STLPort的編譯,選擇Microsoft Visual Studio 20010下面的Visual Studio Tools下面的命令行環(huán)境編譯工具,Visual Studio Command Prompt(2010)。

進(jìn)入STLport目錄,運行

1
2
3
4
cd E:\HaveFun\STLport\STLport.5.2.1
configure.bat msvc9
cd build/lib
nmake clean install

但編譯會出現(xiàn)錯誤,

 

1
2
3
E:\HaveFun\STLport\STLport.5.2.1\stlport\stl/_cstdlib.h(158) : error C2084: function '__int64 abs(__int64)' already has a body
C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\../include/stdlib.h(471) : see previous definition of 'abs'
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\cl.EXE"' : return code '0x2'

估計是STLport還沒有支持2010的問題導(dǎo)致的,檢查了以代碼,和google了一下問題,將_cstdlib.h(158)代碼修正為,

1
2
3
#if !defined(_STLP_MSVC) || (_STLP_MSVC < 1600)
inline _STLP_LONG_LONG abs(_STLP_LONG_LONG __x) { return __x < 0 ? -__x : __x; }
#endif

注意_STLP_MSVC 和 _MSC_VER 是一個東東,就是VC的版本號,

 

STLPort編譯很快就完成了,現(xiàn)在的機(jī)器搞定這個庫已經(jīng)是小意思了。默認(rèn)應(yīng)該有2個STLport版本,使用動態(tài)運行史庫的動態(tài)庫版本,使用靜態(tài)運行時庫的靜態(tài)庫版本。同時文件名稱包含stld的版本是調(diào)試模式版本,在你使用宏_STLP_DEBUG生效。

STLport會自動進(jìn)行鏈接,而且是根據(jù)你工程選擇的是使用動態(tài)runtime library還是靜態(tài)runtime library進(jìn)行控制,決定讓你使用靜態(tài)庫還是動態(tài)庫,而你如果希望你的工程使用動態(tài)runtime library,同時鏈接STLport的靜態(tài)庫就必須用到交叉編譯的庫,編譯使用在host.h文件中_STLP_USE_STATIC_LIB的宏,同時在配置時使用參數(shù)configure.bat  msvc9 --with-dynamic-rtl。詳細(xì)見下表。

版本說明

生成的文件

編譯說明

使用說明

使用動態(tài)運行史庫的動態(tài)庫版本

stlport.5.2.dll  stlport.5.2.lib

stlportd.5.2.dll stlportd.5.2.lib

stlportstld.5.2.dll stlportstld.5.2.lib

默認(rèn)會生成

stlportstld.5.2.lib是調(diào)試模式版本,使用宏_STLP_DEBUG控制

使用靜態(tài)運行時庫的靜態(tài)庫版本

 

stlport_static.lib

stlportd_static.lib

stlportstld_static.lib

默認(rèn)會生成

stlportstld_static.lib是調(diào)試版本,使用宏_STLP_DEBUG控制

使用靜態(tài)運行時庫的動態(tài)庫版本

stlportstld_x.5.2.lib stlportstld_x.5.2.dll

stlportd_x.5.2.lib stlportd_x.5.2.dll

stlport_x.5.2.lib stlport_x.5.2.dll


配置時要

configure.bat msvc9  --with-static-rtl

要修改

stlport/stl/config/host.h

增加#define _STLP_USE_DYNAMIC_LIB

調(diào)試版本需要宏_STLP_DEBUG

使用動態(tài)運行時庫的靜態(tài)庫版本

stlportstld_statix.lib

stlportd_statix.lib

stlport_statix.lib


配置時要

configure.bat  msvc9 --with-dynamic-rtl

要修改

stlport/stl/config/host.h

增加#define _STLP_USE_STATIC_LIB

調(diào)試版本需要宏_STLP_DEBUG

 

注意如果你需要動態(tài)運行時庫的靜態(tài)庫版本(真繞口),先編譯普通版本configure.bat  msvc9,在nmake clean install 編譯,然后在改變host.h文件,再增加#define _STLP_USE_DYNAMIC_LIB(打開注釋),然后再configure.bat  msvc9 --with-dynamic-rtl,再編譯。為啥要這樣?因為STLport的編譯腳本非要拷貝先拷貝動態(tài)庫版本……,這個錯誤讓我在編譯VS2012的版本的時候折騰了1天。特此說明紀(jì)念。

 

如果你希望在你的代碼里面優(yōu)先使用STLport的代碼,而不是微軟的默認(rèn)STL實現(xiàn),你要調(diào)整一下設(shè)置,VC2010的目錄設(shè)置發(fā)生了很大的調(diào)整。以前的版本設(shè)置路徑都在菜單tools\options下VC++ Directory下面進(jìn)行調(diào)整,方便快捷,VS2010做了一個很讓人不爽的改動設(shè)計,你必須先打開一個工程,打開菜單view\property Manager,選擇工程,選工程下DEBUG|WIN32和RELEASE|WIN32下面的Microsoft.Cpp.Win32.user,注意這兩層菜單都可以打開選項界面,但是一個是工程的,一個是全局的(一定要選擇Microsoft.Cpp.Win32.user這層),我經(jīng)常搞混,然后一頭霧水。

clip_image003

然后再進(jìn)行目錄調(diào)整,注意要去掉繼承選項,然后將STLPort的目錄要放到所有目錄前面,讓回將默認(rèn)的一條條輸入到其后面去(對于繼承來的無法調(diào)整目錄的先后順序),比原來麻煩不少。據(jù)說這個改動是為了VS2010測試版時有人希望對不同的用戶提供不同的Libaray管理,我靠他先人板板,程序員有幾個人和他人共用PC的,而且還要編程目錄不一致。

BOOST的編譯就更加痛苦一些了。首先我的4核機(jī)器上要編譯幾個小時才能編譯完成。大家要有點耐心。

當(dāng)然如果你的要求不高,你可以選擇一個簡單的方法,獲取BOOST已經(jīng)編譯好的庫,liangfeng推薦了一個網(wǎng)站給我,www. 。上面會提供各種版本VS版本,各個版本號的BOOST庫供你下載,而且都是全自動化的,非常方便。如下圖:

clip_image005

可以看出,BOOSTPro提供了VC2003,VC2005,VC2008,VC2010的,多線程動態(tài)runtime library動態(tài)庫版本,多線程動態(tài)runtime library靜態(tài)庫版本,多線程靜態(tài)runtime library靜態(tài)庫版本(每個都10多M),單線程靜態(tài)runtime library靜態(tài)庫版本。注意你要是全部下載的化,有好幾個G的文件,下載的過程也要有點耐心。

當(dāng)然全自動化的結(jié)果是由代價的,一是下載給你的庫沒有提供pdb文件,如果你想調(diào)試boost庫的代碼,發(fā)現(xiàn)問題,這招就不要用了。二是,他提供的下載源代碼文件里面只有頭文件,三是,如果你想用STLport+BOOST(STLport作為底層庫,而不是使用微軟的實現(xiàn))的方式,BOOSTPro網(wǎng)站沒有提供這種庫給你下載。四是,目前他沒有64位的版本。

我因為想用STLPort替代現(xiàn)有的庫實現(xiàn),我也要選擇自己進(jìn)行編譯。

要說明的是BOOST庫目前的版本已經(jīng)很容易編譯了,而且會自動識別那些庫可以編譯,那些不能編譯了。仍然選擇Visual Studio Command Prompt(2010) 進(jìn)入boost的根目錄,

cd E:\HaveFun\Boost\boost.1.46.1

bootstrap.bat

bjam.exe就生產(chǎn)了。

Boost的build說明文檔如裹腳布一樣,又臭又長,如果你沒有耐心直接看bjam的幫助,

bjam —-help

但倒霉的是這里面又沒有說明如果要用STLPort怎么幫,這個只有看幫助文檔。如果要用STLPort作為底層編譯BOOST,詳細(xì)見BOOST的說明,Chapter 33. Boost.Build V2 User Manual 中的Reference

1
2
3
4
5
6
7
STLport library
The STLport library is an alternative implementation of C++ runtime library. Boost.Build supports using that library on Windows platfrom. Linux is hampered by different naming of libraries in each STLport version and is not officially supported.
Before using STLport, you need to configure it in user-config.jam using the following syntax:
using stlport : [version] : header-path : [library-path] ;
Where version is the version of STLport, for example 5.1.4, headers is the location where STLport headers can be found, and libraries is the location where STLport libraries can be found. The version should always be provided, and the library path should be provided if you're using STLport's implementation of iostreams. Note that STLport 5.* always uses its own iostream implementation, so the library path is required.
When STLport is configured, you can build with STLport by requesting stdlib=stlport on the command line.

翻譯過來就是如果你想希望默認(rèn)使用STLPort的庫,你要編輯project-config.jam 增加一行

using msvc ;

using stlport : 5.2.1 : E:/HaveFun/STLport/STLport.5.2.1/stlport : E:/HaveFun/STLport/STLport.5.2.1/lib ;

#注意路徑用/,或者\\

說明一下編譯參數(shù)和屬性,

threading=single,multi 當(dāng)然單線程版本你用的干嘛,不編譯還可以節(jié)約一般的時間。

link=shared,static 生成的庫是靜態(tài)還是動態(tài)

runtime-link= shared,static,運行時庫使用動態(tài)還是靜態(tài)的。

stdlib=stlport 使用STLport

--build-type=commplete,minimal commplete標(biāo)識所有的版本都編譯,minimal只編譯多線程的靜態(tài)庫版本。

--stagedir=./stage 指本地構(gòu)建的存放庫的目錄,

--show-libraries 顯示所有需要編譯的庫,其實不多,天知道為什么要了那么大的空間。

--with-<lib> 單獨編譯你想編譯的庫

--without-<lib> 編譯所有的庫,除了你制定不編譯的以外。

然后就可以開始編譯了,注意路徑名稱

1
bjam threading= multi link=shared,static stdlib=stlport --stagedir=./stage

然后就是漫長的等待……,等待……等待……如果全部編譯,你至少可以用這個時間看完一部電影……

1.46版本生成的靜態(tài)庫在stage\lib下,動態(tài)庫和相應(yīng)的鏈接庫在bin.v2下面。bin.v2下面,目錄一層又一層,建議你全部搜索了拷貝出來,放在一個目錄下(我一般喜歡把所有的庫放到一個目錄下面)。1.47版本好像全部放到stage目錄下了,省事不少。

Boost是根據(jù)每個庫生成對應(yīng)的.lib文件的,實在不明白為什么不合并成一個庫文件。

另外,BOOST也采用了幫助你自動鏈接的技術(shù),可以省卻你一些麻煩。BOOST庫的命名比STLPort還要更加眼花繚亂,后綴含義簡直是亂花漸欲迷人眼。比如libboost_serialization-vc100-mt-sgdp-1_49.lib。

前面是庫名稱,vc100表示編譯器,最后面是版本號。下面來解釋一下中間那些字符的含義:

版本號中標(biāo)記的含義

表示的含義

lib前綴

靜態(tài)庫版本(動態(tài)庫版本沒有l(wèi)ib的前綴)

vc100

編譯器版本好,vc100標(biāo)識vc10.0

s

運行時庫試用靜態(tài)庫版本(運行時庫試用動態(tài)庫版本沒有特殊標(biāo)記)

gd

debug調(diào)試版本(Release版本沒有特殊標(biāo)記)

p

使用STLport作為STL實現(xiàn)的版本,

mt

多線程版本,(單線程版沒有特殊標(biāo)記)

注意BOOST DEBUG版本使用的是帶調(diào)試模式的STLPort,編譯你的代碼必須定義_STLP_DEBUG=1,這時候編譯器回去鏈接調(diào)試模式的STLport版本。

最近打算認(rèn)真學(xué)習(xí)一下Boost庫,準(zhǔn)備在日常工作中,用Boost替換自己常用的ACE庫作為跨平臺實現(xiàn)。大家耐心等待后續(xù)的文章。

【本文作者是fullsail(雁渡寒潭),本著自由的精神,你可以在無盈利的情況完整轉(zhuǎn)載此文檔,轉(zhuǎn)載時請附上BLOG鏈接:http://www.cnblogs.com/fullsail,否則每字一元不講價。對Baidu文庫加價一倍】

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多