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提交了,等待反馈。