Проблема связывания стандартной библиотеки Solaris SunStudio 12.4

Я пытаюсь скомпилировать пример из 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, а затем другие синтаксические ошибки, потому что теперь он думает, что весь следующий код является недействительным.

Другие вещи, которые я пробовал:

  • Добавление -lC перед -lCrun (компоновщик не может найти эту библиотеку)
  • Добавление -lc (похожая проблема).
  • Проверил в каталоге SUNWspro / libs и обнаружил, что оба libCrun.so и libCstd.so существуют.
  • Помещение -lCstd перед -lCrun

Другая (менее релевантная) информация:

  • SPARC
  • рассматриваемый пример asio — httpServer (в примерах я считаю, что он находится в каталоге server)

3

Решение

Из документов:

В режиме C ++ 11 компилятор CC использует ABI g ++ и версию
библиотека времени выполнения g ++, поставляемая с Oracle Solaris Studio. За
В этом выпуске используется версия 4.8.2 библиотеки времени выполнения g ++.

ABI описывает детали низкого уровня в сгенерированном объектном коде.
Модули, которые используют разные ABI, не могут быть успешно связаны друг с другом
в программу. Это означает, что вы должны использовать режим C ++ 11 на всех
модули в вашей программе, или ни один из них
.

Таким образом, с учетом сказанного, вы также должны указать «—std = c ++ 11» для фазы компоновщика. Вы не делаете это в настоящее время.

2

Другие решения


По вопросам рекламы [email protected]