Проблема привязки стандартной библиотеки 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

Проблема:

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

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

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

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

  • СПАРК
  • рассматриваемый образец asio - это httpServer (я полагаю, что в примерах он находится в каталоге сервера)

person Maria    schedule 21.04.2015    source источник
comment
Я удалил свой ответ, потому что я думаю, что был неправ. Возможно, я раньше упускал из виду ваши ошибки компоновщика.   -  person    schedule 22.04.2015
comment
Попробуйте добавить -lstdc++ в аргументы вашего компилятора.   -  person    schedule 22.04.2015
comment
@TechnikEmpire компоновщик не может найти библиотеку sdtc++. Также в предыдущем комментарии вы предложили добавить -lm. Я тоже пробовал это, и хотя компоновщик может его найти, это не имеет значения.   -  person Maria    schedule 22.04.2015
comment
docs.oracle.com/cd/E37069_01/html/E37071/gndfg. html - это определенно проблема, связанная с тем, что просто каким-то образом не удается связать стандартную библиотеку.   -  person    schedule 23.04.2015
comment
Если вы просто используете связанные ошибки компилятора в качестве условий поиска, вы столкнетесь с десятками сообщений, подобных этому stackoverflow.com/questions/7038258/, все они указывают на исходную проблему. Согласно документам в режиме С++ 11, он просто использует стандартную библиотеку, предоставленную g++ 4.8.2. Найдите свою файловую систему и, очевидно, где должны быть пути, пытаясь найти это, чтобы увидеть, есть ли оно даже в вашей системе.   -  person    schedule 23.04.2015
comment
Вместо -std=c++11 вы пробовали -library=stdcxx4 (или -library=stlport4)? Это рекомендуемые режимы для использования с усилением. Обратите внимание, что все эти флаги должны быть одинаковыми при компиляции и линковке (и отбрасывать -lCrun и -lCstd).   -  person Marc Glisse    schedule 23.04.2015
comment
@MarcGlisse Да, я попробовал stlport4 и смог скомпилировать, но при запуске сразу же возникли ошибки сегментации. В конце концов, мы решили пойти другим путем, но я думаю, что я мог бы понять это, приложив больше усилий. Должен ли я оставить вопрос для других зрителей или удалить его?   -  person Maria    schedule 23.04.2015
comment
@maria Я не знаю, что тебе делать, раз уж ты отказываешься от вопроса. Я бы предложил только ради того, чтобы не быть помеченным как плохой пост, просто оставить вопрос в покое, а не удалять его. На этом сайте есть глупая система, когда, если вы начнете удалять свои собственные сообщения, он заподозрит вас в том, что вы создатель низкокачественного материала, и в конечном итоге забанит вас. Вы пытались указать std=... как в командах фазы компиляции, так и в компоновщике?   -  person    schedule 24.04.2015
comment
@TechnikEmpire К сожалению, мы решили отказаться от него до того, как я добрался до него. Если я когда-нибудь попробую это, я дам знать сообществу. Я подозреваю, что это решило бы проблему.   -  person Maria    schedule 27.04.2015


Ответы (1)


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

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

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

Итак, с учетом сказанного, вы также должны указать "--std=c++11" для фазы компоновщика. Вы не делаете этого сейчас.

person Community    schedule 22.04.2015
comment
Но iterator_traits — это даже не функция C++11, не так ли? Я думал, что это С++ 03, поэтому я действительно смущен тем, почему он не может скомпилировать его, не установив для std значение С++ 11. Завтра посмотрю код сообщения. - person Maria; 22.04.2015
comment
Это и то, и другое. Мне нужно std=c++11 для компиляции, но когда я компилирую с c++11, я не могу связать. Интересен тот факт, что компилятор поддерживает только архитектуры x86. - person Maria; 22.04.2015
comment
Ах! Хорошо, это действительно хорошая информация. Спасибо за все ваши усилия. - person Maria; 23.04.2015