Solaris SunStudio 12.4 标准库链接问题
Solaris SunStudio 12.4 Standard Library Linking Issue
我正在尝试使用 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实际上是之前生成的所有object文件的列表)
CC -m32 -L./boost/sparc/sun/release32/lib *.o -o httpServer -lCrun -lCstd -lxnet -lboost_system
问题:
我得到一堆未解析的标准库符号(如字符串、ios_base、语言环境等)。我发布了链接器错误 here.
我强烈怀疑这与-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_
包含和使用此 header 的其他内容会生成类似 Error: iterator_traits is not a member of boost::detail
的错误,然后会生成其他语法错误,因为现在它认为以下所有代码都是无效的。
我尝试过的其他事情:
- 在 -lCrun 之前添加 -lC(链接器找不到该库)
- 添加 -lc(类似问题)。
- 查看SUNWspro/libs目录,发现libCrun.so和libCstd.so都存在
- 将 -lCstd 放在 -lCrun 之前
其他(不太相关)信息:
- SPARC
- 有问题的 asio 示例是 httpServer(我相信它在示例中的服务器目录下)
In C++ 11 mode, the CC compiler uses the g++ ABI and a version of the
g++ runtime library that is supplied with Oracle Solaris Studio. For
this release, version 4.8.2 of the g++ runtime library is used.
An ABI describes the low-level details in the generated object code.
Modules that use different ABIs cannot successfully be linked together
into a program. This means that you must use C++11 mode on all
modules in your program, or none of them.
话虽如此,您也必须在链接器阶段指定“--std=c++11”。您目前没有这样做。
我正在尝试使用 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实际上是之前生成的所有object文件的列表)
CC -m32 -L./boost/sparc/sun/release32/lib *.o -o httpServer -lCrun -lCstd -lxnet -lboost_system
问题:
我得到一堆未解析的标准库符号(如字符串、ios_base、语言环境等)。我发布了链接器错误 here.
我强烈怀疑这与-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_
包含和使用此 header 的其他内容会生成类似 Error: iterator_traits is not a member of boost::detail
的错误,然后会生成其他语法错误,因为现在它认为以下所有代码都是无效的。
我尝试过的其他事情:
- 在 -lCrun 之前添加 -lC(链接器找不到该库)
- 添加 -lc(类似问题)。
- 查看SUNWspro/libs目录,发现libCrun.so和libCstd.so都存在
- 将 -lCstd 放在 -lCrun 之前
其他(不太相关)信息:
- SPARC
- 有问题的 asio 示例是 httpServer(我相信它在示例中的服务器目录下)
In C++ 11 mode, the CC compiler uses the g++ ABI and a version of the g++ runtime library that is supplied with Oracle Solaris Studio. For this release, version 4.8.2 of the g++ runtime library is used.
An ABI describes the low-level details in the generated object code. Modules that use different ABIs cannot successfully be linked together into a program. This means that you must use C++11 mode on all modules in your program, or none of them.
话虽如此,您也必须在链接器阶段指定“--std=c++11”。您目前没有这样做。