VC++2010下編譯STLport,Boost

最近在想向Boost轉移,努力掌握Boost代碼的過程中,

STLport版本:5.2.1

Boost版本:1.4.6.1  (1.4.7.0,1.4.9.0也OK)

編譯器Visual Studio2010

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

進入STLport目錄,運行

cd E:\HaveFun\STLport\STLport.5.2.1

configure.bat msvc9

cd buidl/lib

nmake clean install

但編譯會出現錯誤,

E:\HaveFun\STLport\STLport.5.2.1\stlport\stl/_cstdlib.h(158): error C2084: func

tion '__int64 abs(__int64)' already has a body

       C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\../include/stdl

ib.h(471) : see previous definition of 'abs'

NMAKE : fatal error U1077: '"C:\ProgramFiles\Microsoft Visual Studio 10.0\VC\BI

N\cl.EXE"' : return code '0x2'

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

#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編譯很快就完成了,現在的機器搞定這個庫已經是小意思了。默認應該有2個STLport版本,使用動態運行史庫的動態庫版本,使用靜態運行時庫的靜態庫版本。同時文件名稱包含stld的版本是調試模式版本,在你使用宏_STLP_DEBUG生效。

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

版本說明

生成的文件

編譯說明

使用說明

使用動態運行史庫的動態庫版本

stlport.5.2.dll  stlport.5.2.lib

stlportd.5.2.dll stlportd.5.2.lib

stlportstld.5.2.dll stlportstld.5.2.lib

默認會生成

stlportstld.5.2.lib是調試模式版本,使用宏_STLP_DEBUG控制

使用靜態運行時庫的靜態庫版本

 

stlport_static.lib

stlportd_static.lib

stlportstld_static.lib

默認會生成

stlportstld_static.lib是調試版本,使用宏_STLP_DEBUG控制

使用靜態運行時庫的動態庫版本

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

要修改

stlport/stl/config/host.h

增加#define _STLP_USE_DYNAMIC_LIB

配置時要

configure.bat  --with-static-rtl

要使用宏_STLP_USE_DYNAMIC_LIB

調試版本仍然需要宏_STLP_DEBUG

使用動態運行時庫的靜態庫版本

stlportstld_statix.lib

stlportd_statix.lib

stlport_statix.lib

要修改

stlport/stl/config/host.h

增加#define _STLP_USE_STATIC_LIB

配置時要

configure.bat  --with-dynamic-rtl

要使用宏_STLP_USE_STATIC_LIB

調試版本仍然需要_STLP_DEBUG


 

【注意】後來有一次copy代碼,結果又導致代碼不過,檢查了半天,才發現導致問題的是拷貝進來的一段代碼放入了一個宏_STLP_USE_BOOST_SUPPORT,故名思議,這個是要在STLport中間使用boost某些支持。在STLport的User_config.h中相關說明。

/*

 * Toachieve many different optimizations within the template implementationsSTLport

 * uses sometype traits technique. With this macro you can ask STLport to use the famous

 * boosttype traits rather than the internal one. The advantages are more compiler

 *integration and a better support. If you only define this macro once theSTLport has been

 * built youjust have to add the boost install path within your include path. If you want

 * to usethis feature at STLport built time you will have to define the

 *STLP_BUILD_BOOST_PATH enrironment variable with the value of the boost librarypath.

 */

google後發現,這仍然是一個bug,如果要使用這個特性,要在Type_traits.h文件中增加一行代碼。

#ifdef _STLP_USE_BOOST_SUPPORT

#  include<stl/boost_type_traits.h>

#  include<boost/type_traits/add_reference.hpp>

#  include<boost/type_traits/add_const.hpp>

#  include<boost/type_traits/remove_const.hpp> /*新添加此行*/

#endif /* _STLP_USE_BOOST_SUPPORT */

同時生成makefile的時候還要增加一個參數--use-boost配置boost的目錄,或者增加如前面說明的環境變量。

configure msvc9 --with-static-rtl --with-dynamic-rtl--use-boost %boostDir%

我自己不想用這個特性,在我自己的代碼刪除這個宏了事。

 

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

 

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

 

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

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



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

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

我因爲想用STLPort替代現有的庫實現,我也要選擇自己進行編譯。

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

cd E:\HaveFun\Boost\boost.1.46.1

bootstrap.bat

bjam.exe就生產了。

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

bjam —-help

但倒黴的是這裏面又沒有說明如果要用STLPort怎麼幫,這個只有看幫助文檔。如果要用STLPort作爲底層編譯BOOST,詳細見BOOST的說明,Chapter 33. Boost.Build V2 User Manual 中的Reference

STLport library

The STLport library is an alternativeimplementation of C++ runtime library. Boost.Build supports using that libraryon Windows platfrom. Linux is hampered by different naming of libraries in eachSTLport version and is not officially supported.

 

Before using STLport, you need to configure it inuser-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 isthe location where STLport libraries can be found. The version should always beprovided, and the library path should be provided if you're using STLport'simplementation of iostreams. Note that STLport 5.* always uses its own iostreamimplementation, so the library path is required.

 

When STLport is configured, you can build with STLport byrequesting stdlib=stlport on the command line.

翻譯過來就是如果你想希望默認使用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 ;

 

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

說明一下編譯參數和屬性,

threading=single,multi 當然單線程版本你用的幹嘛,不編譯還可以節約一般的時間。

link=shared,static      生成的庫是靜態還是動態

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

stdlib=stlport  使用STLport

--build-type=commplete,minimal commplete標識所有的版本都編譯,minimal只編譯多線程的靜態庫版本。

--stagedir=./stage 指本地構建的存放庫的目錄,

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

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

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

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

bjam threading=multilink=shared,static stdlib=stlport --stagedir=./stage

上面這個命令編譯的是運行時庫爲動態庫的版本,然後就是漫長的等待……,等待……而如果全部編譯(--build-type=commplete),你至少可以用這個時間看完一部電影……

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

Boost是根據每個庫生成對應的.lib文件的,實在不明白爲什麼不合併成一個庫文件。

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

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

版本號中標記的含義

表示的含義

lib前綴

靜態庫版本(動態庫版本沒有lib的前綴)

vc100

編譯器版本好,vc100標識vc10.0

s

運行時庫試用靜態庫版本(運行時庫試用動態庫版本沒有特殊標記)

gd

debug調試版本(Release版本沒有特殊標記)

p

使用STLport作爲STL實現的版本,

mt

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

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

最近打算認真學習一下Boost庫,準備在日常工作中,用Boost替換自己常用的ACE庫作爲跨平臺實現。大家耐心等待後續的文章。

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章