3

我正在尝试使用 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 (我相信它在示例中的服务器目录下)
4

1 回答 1

2

来自文档:

在 C++ 11 模式下,CC 编译器使用 g++ ABI 和随 Oracle Solaris Studio 提供的 g++ 运行时库版本。对于此版本,使用了 g++ 运行时库的 4.8.2 版。

ABI 描述了生成的目标代码中的低级细节。使用不同 ABI 的模块无法成功链接到一个程序中。这意味着您必须在程序中的所有模块上使用 C++11 模式,或者一个都不使用

话虽如此,您也必须为链接器阶段指定“--std=c++11”。你目前没有这样做。

于 2015-04-22T01:44:41.413 回答