2015-04-21 9 views
3

Я пытаюсь скомпилировать образец из boost-asio на Solaris-10 с использованием SunStudio 12.4. Компиляция с GCC 4.9.2 работает, но по линии мне потребуется поддержка обоих компиляторов, поэтому просто переключение - это не вариант.Solaris SunStudio 12.4 Стандартная библиотека, связанная с проблемой

выход CC -V:CC: Sun C++ 5.13 SunOS_sparc 2014/10/20

Компиляция Line: (для каждого 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 на самом деле список всех ранее созданных объектных файлов)

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.

код вызывает это компилировать отказ в наддува 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 (я считаю, что в каталоге сервера в примерах)
+0

Я удалил свой ответ, потому что я думаю, что был неправ. Возможно, я раньше замалчивал ваши ошибки компоновщика. –

+0

Попробуйте добавить -lstdC++ в свои аргументы компилятора. –

+0

@TechnikEmpire компоновщик не может найти библиотеку sdtC++. Также в предыдущем комментарии вы предложили добавить -lm. Я тоже это пробовал, и хотя компоновщик может его найти, это не имеет значения. – Maria

ответ

2

From The Docs:

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

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

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

+0

Но iterator_traits не является даже функцией C++ 11, не так ли? Я думал, что это C++ 03, поэтому я очень смущен тем, почему он не может скомпилировать его, не устанавливая std на C++ 11. Завтра я буду искать код публикации. – Maria

+0

Это и то, и другое. Мне нужно std = C++ 11 для компиляции, но когда я компилирую с помощью C++ 11, я не могу связать.Интересно, что компилятор поддерживает только архитектуры x86. – Maria

+0

Ах! Хорошо, это действительно хорошая информация. Спасибо за все ваши усилия. – Maria