Я пытаюсь скомпилировать пример из boost-asio на Solaris-10 с помощью SunStudio 12.4. Компиляция с 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
Эта проблема:
Я получаю кучу неразрешенных символов для стандартного библиотечного материала (например, string, 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.
Код, вызывающий этот сбой компиляции 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
, а затем другие синтаксические ошибки, потому что теперь он думает, что весь следующий код является недействительным.
Другие вещи, которые я пробовал:
Другая (менее релевантная) информация:
В режиме C ++ 11 компилятор CC использует ABI g ++ и версию
библиотека времени выполнения g ++, поставляемая с Oracle Solaris Studio. За
В этом выпуске используется версия 4.8.2 библиотеки времени выполнения g ++.ABI описывает детали низкого уровня в сгенерированном объектном коде.
Модули, которые используют разные ABI, не могут быть успешно связаны друг с другом
в программу. Это означает, что вы должны использовать режим C ++ 11 на всех
модули в вашей программе, или ни один из них.
Таким образом, с учетом сказанного, вы также должны указать «—std = c ++ 11» для фазы компоновщика. Вы не делаете это в настоящее время.