我正在尝试使用 SunStudio 12.4 从 Solaris-10 上的 boost-asio 编译示例。使用 GCC 4.9.2 进行编译是可行的,但我需要同时支持这两种编译器,因此不能只切换。
CC -V 输出: CC: Sun C++ 5.13 SunOS_sparc 2014/10/20
编译行:(对于每个 cpp 文件)
CC -m32 -std=c++11 -I./asio-1.10.6/include -I./boost/include/boost-1_58 -c *.cpp -o *.o
Linker Line:(注意 *.o 实际上是之前生成的所有目标文件的列表)
CC -m32 -L./boost/sparc/sun/release32/lib *.o -o httpServer -lCrun -lCstd -lxnet -lboost_system
问题:
我得到一堆标准库东西的未解析符号(如字符串、ios_base、语言环境等)。我在这里发布了链接器错误。
我强烈怀疑这与使用-std=c++11
. 由于iterator_traits
. 尽管iterator_traits
不是 C++11 功能,但由于某种原因,SunStudio 无法编译它,除非它在 c++11 模式下编译。关于的错误iterator_traits
:
Error: iterator_traits is not a member of std.
导致此编译失败的代码在 boost 中boost/detail/iterator.hpp
。代码如下。
// (C) Copyright David Abrahams 2002.
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef ITERATOR_DWA122600_HPP_
#define ITERATOR_DWA122600_HPP_
// This header is obsolete and will be deprecated.
#include <iterator>
namespace boost
{
namespace detail
{
using std::iterator_traits;
using std::distance;
} // namespace detail
} // namespace boost
#endif // ITERATOR_DWA122600_HPP_
包含和使用此标头的其他内容会生成错误,例如Error: iterator_traits is not a member of boost::detail
,然后是其他语法错误,因为现在它认为以下所有代码都是无效的。
我尝试过的其他事情:
- 在 -lCrun 之前添加 -lC (链接器找不到该库)
- 添加 -lc (类似问题)。
- 查看 SUNWspro/libs 目录,发现 libCrun.so 和 libCstd.so 都存在。
- 将 -lCstd 放在 -lCrun 之前
其他(不太相关)信息:
- SPARC
- 有问题的 asio 示例是 httpServer (我相信它在示例中的服务器目录下)