Я пытаюсь собрать образец из 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 (я полагаю, что в примерах он находится в каталоге сервера)
-std=c++11
вы пробовали-library=stdcxx4
(или-library=stlport4
)? Это рекомендуемые режимы для использования с усилением. Обратите внимание, что все эти флаги должны быть одинаковыми при компиляции и линковке (и отбрасывать-lCrun
и-lCstd
). - person Marc Glisse   schedule 23.04.2015