Solaris SunStudio 12.4标准库链接问题

Solaris SunStudio 12.4 Standard Library Linking Issue

本文关键字:链接 问题 标准 SunStudio Solaris      更新时间:2023-10-16

我正试图使用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

链接行:(注意*.o实际上是以前生成的所有对象文件的列表)

CC -m32 -L./boost/sparc/sun/release32/lib *.o -o httpServer -lCrun -lCstd -lxnet -lboost_system

问题:

我得到了一堆标准库的未解析符号(比如字符串、ios_base、locale等)。我在这里发布了链接器错误。

我强烈怀疑这与-std=c++11的使用有关。我之所以包含此选项,是因为iterator_traits存在编译问题。尽管iterator_traits不是C++11的特性,但由于某些原因,SunStudio不能编译它,除非它是在C++11模式下编译的。关于iterator_traits:的错误

Error: iterator_traits is not a member of std.

导致此编译失败的代码位于boostboost/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之类的错误,然后还会生成其他语法错误,因为现在它认为以下所有代码都无效。

我尝试过的其他事情:

  • 在-lRun之前添加-lC(链接器找不到该库)
  • 添加-lc(类似问题)
  • 已检查SUNWspro/libs目录,发现libCrun.so和libCstd.so都存在
  • 将-lCstd置于-lCrun之前

其他(不太相关)信息:

  • SPARC
  • 有问题的asio示例是httpServer(我相信在示例中它位于服务器目录下)

来自文档:

在C++11模式中,CC编译器使用g++ABI和Oracle Solaris Studio附带的g++运行时库。对于本版本使用g++运行库的4.8.2版本。

ABI描述生成的对象代码中的低级细节。使用不同ABI的模块无法成功连接在一起进入程序这意味着您必须在所有程序中的模块,或者没有模块

因此,您也必须在链接器阶段指定"--std=c++11"。你现在没有这么做。