MSVC2005 +STLPort 編譯ACE失敗
這個問題應該在ACE的5.6到5.7.5的的版本存在。目前我已經提交了bug,應該可以得到解決。
常看我Blog的人應該知道(就那麼點瀏覽量,純屬吹牛),我是一個MSVC的Dinkumware STL的懷疑者,我一方面覺得某些實現不地道(和未來的標準BOOST的不一樣),一方面我對他的性能也表示不認可。當然主要是由於實現不標準,會導致我在移植的時候不舒服,所以我現在了使用STLPort作爲我默認的STL實現。
前幾日倒黴,被狗日的流氓軟件《桌面美化秀》整蠱(直接導致系統無法啓動),重裝了自己的機器,鑑於大家對於2005的很多功能的認可,我決定升級自己的MSVC2003成爲2005。裝之前忘記改變一個編譯環境的成本是大把的。於是被迫重新編譯大量的庫,包括STLPort,ACE。
由於俺使用STLPort,所以最開始要先編譯STLPort,然後把MSVC的include中,增加STLPort的include,而且要調整到第一行,(這樣纔會默認優先使用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,瞟了一下代碼,初步認爲是作者希望使用微軟的的MSCV的stdext::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 STL的MSVC,所以這個代碼應該改爲:
//注意這兒增加了一個_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>
先自己改了將就的用,也在ACE的bugzilla提交了,等待反饋。