MSVC2005 +STLPort 編譯ACE失敗

   MSVC2005 +STLPort 編譯ACE失敗

這個問題應該在ACE5.65.7.5的的版本存在。目前我已經提交了bug,應該可以得到解決。

常看我Blog的人應該知道(就那麼點瀏覽量,純屬吹牛),我是一個MSVCDinkumware STL的懷疑者,我一方面覺得某些實現不地道(和未來的標準BOOST的不一樣),一方面我對他的性能也表示不認可。當然主要是由於實現不標準,會導致我在移植的時候不舒服,所以我現在了使用STLPort作爲我默認的STL實現。

前幾日倒黴,被狗日的流氓軟件《桌面美化秀》整蠱(直接導致系統無法啓動),重裝了自己的機器,鑑於大家對於2005的很多功能的認可,我決定升級自己的MSVC2003成爲2005。裝之前忘記改變一個編譯環境的成本是大把的。於是被迫重新編譯大量的庫,包括STLPortACE

由於俺使用STLPort,所以最開始要先編譯STLPort,然後把MSVCinclude中,增加STLPortinclude,而且要調整到第一行,(這樣纔會默認優先使用SLTPort)。STLPort編譯很順利,編譯到ACE出現了編譯錯誤,如下:

1>h:/HaveFun/ACE/ACE-5.7.1/ACE_wrappers/ace/checked_iterator.h(42) :

error C2653: 'stdext' : is not a class or namespace name

1>h:/HaveFun/ACE/ACE-5.7.1/ACE_wrappers/ace/checked_iterator.h(42) :

error C2143: syntax error : missing ';' before '<'

1>h:/HaveFun/ACE/ACE-5.7.1/ACE_wrappers/ace/checked_iterator.h(42) :

error C4430: missing type specifier - int assumed. Note: C++ does not support

default-int

1>h:/HaveFun/ACE/ACE-5.7.1/ACE_wrappers/ace/checked_iterator.h(42) :

error C2988: unrecognizable template declaration/definition

 

 

爲了這個bug,瞟了一下代碼,初步認爲是作者希望使用微軟的的MSCVstdext::checked_array_iterator檢查迭代器的函數 但是作者沒有考慮俺們這些不使用微軟默認Dinkumware STL的人。而ACE在這方面的宏處理應該有一些問題。然後上網google了一下這個問題,發現的確有同樣的倒黴蛋,但是糟糕的是ACE好像解決了一次,後面又由於宏的調整出現了。

# if defined (_MSC_VER) && (_MSC_FULL_VER >= 140050000)

template <typename PTR>

stdext::checked_array_iterator<PTR>

ACE_make_checked_array_iterator (PTR buf, size_t len)

作者應該是隻考慮了默認使用Dinkumware STLMSVC,所以這個代碼應該改爲:

//注意這兒增加了一個_STLPORT_VERSION 如果使用了STLPORT這個宏,這個宏應該起作用

# if (defined (_MSC_VER)) && (_MSC_FULL_VER >= 140050000) && (!defined (_STLPORT_VERSION))

// Checked iterators are currently only supported in MSVC++ 8 or better.

#  include <iterator>

# endif  /* _MSC_VER >= 1400 */

//這兒的修改和上面一樣。

# if (defined (_MSC_VER)) && (_MSC_FULL_VER >= 140050000) && (!defined (_STLPORT_VERSION))

template <typename PTR>

stdext::checked_array_iterator<PTR>

先自己改了將就的用,也在ACEbugzilla提交了,等待反饋。

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