Как собрать Boost V1.57 с помощью компилятора Solaris Studio 12.4

Я попытался собрать Boost V1.57 с совершенно новым компилятором Solaris Studio 12.4 на платформе Intel Solaris V11.2. Я попытался опубликовать ошибки на форум разработчиков OTN, но оказалось, что моя простая учетная запись OTN не позволяет мне добавлять новые сообщения. Отсюда вопрос к СО.

Краткое резюме: 1) Начальная загрузка прошла нормально:

cd tools/build
./bootstrap.sh --with-toolset=sun

2) Командная строка сборки (обратите внимание, что я поставил b2 и компилятор в свой PATH). Это "поэтапная" сборка, т.е. без этапа установки, просто для того, чтобы увидеть, что все библиотеки могут быть собраны:

b2 -j2 --build-dir=build toolset=sun address-model=64 threading=multi variant=release  stage >& /tmp/boost_1_57_build.log

Вот сжатый список ошибок:

"./boost/archive/binary_iarchive.hpp", line 57: Error: Multiple declaration for adjust_counter.
"./boost/archive/binary_iarchive.hpp", line 57: Error: Unexpected type name "get_counter<boost::archive::binary_iarchive>::type" encountered.
"./boost/archive/binary_oarchive.hpp", line 57: Error: Multiple declaration for adjust_counter.
"./boost/archive/binary_oarchive.hpp", line 57: Error: Unexpected type name "get_counter<boost::archive::binary_oarchive>::type" encountered.
"./boost/archive/detail/register_archive.hpp", line 45: Error: The function "adjust_counter" must have a prototype.
"./boost/archive/detail/register_archive.hpp", line 46: Error: Expression must have a constant value.
"./boost/archive/detail/register_archive.hpp", line 47: Error: Expression must have a constant value.
"./boost/archive/detail/register_archive.hpp", line 48: Error: An integer constant expression is required within the array subscript operator.
"./boost/archive/polymorphic_iarchive.hpp", line 170: Error: Multiple declaration for adjust_counter.
"./boost/archive/polymorphic_iarchive.hpp", line 170: Error: Unexpected type name "get_counter<boost::archive::polymorphic_iarchive>::type" encountered.
"./boost/archive/polymorphic_oarchive.hpp", line 153: Error: Multiple declaration for adjust_counter.
"./boost/archive/polymorphic_oarchive.hpp", line 153: Error: Unexpected type name "get_counter<boost::archive::polymorphic_oarchive>::type" encountered.
"./boost/archive/text_iarchive.hpp", line 136: Error: Multiple declaration for adjust_counter.
"./boost/archive/text_iarchive.hpp", line 136: Error: Unexpected type name "get_counter<boost::archive::text_iarchive>::type" encountered.
"./boost/archive/text_oarchive.hpp", line 121: Error: Multiple declaration for adjust_counter.
"./boost/archive/text_oarchive.hpp", line 121: Error: Unexpected type name "get_counter<boost::archive::text_oarchive>::type" encountered.
"./boost/archive/text_wiarchive.hpp", line 132: Error: Multiple declaration for adjust_counter.
"./boost/archive/text_wiarchive.hpp", line 132: Error: Unexpected type name "get_counter<boost::archive::text_wiarchive>::type" encountered.
"./boost/archive/text_woarchive.hpp", line 146: Error: Multiple declaration for adjust_counter.
"./boost/archive/text_woarchive.hpp", line 146: Error: Unexpected type name "get_counter<boost::archive::text_woarchive>::type" encountered.
"./boost/archive/xml_iarchive.hpp", line 146: Error: Multiple declaration for adjust_counter.
"./boost/archive/xml_iarchive.hpp", line 146: Error: Unexpected type name "get_counter<boost::archive::xml_iarchive>::type" encountered.
"./boost/archive/xml_oarchive.hpp", line 135: Error: Multiple declaration for adjust_counter.
"./boost/archive/xml_oarchive.hpp", line 135: Error: Unexpected type name "get_counter<boost::archive::xml_oarchive>::type" encountered.
"./boost/archive/xml_wiarchive.hpp", line 152: Error: Multiple declaration for adjust_counter.
"./boost/archive/xml_wiarchive.hpp", line 152: Error: Unexpected type name "get_counter<boost::archive::xml_wiarchive>::type" encountered.
"./boost/archive/xml_woarchive.hpp", line 142: Error: Multiple declaration for adjust_counter.
"./boost/archive/xml_woarchive.hpp", line 142: Error: Unexpected type name "get_counter<boost::archive::xml_woarchive>::type" encountered.
"./boost/math/cstdfloat/cstdfloat_types.hpp", line 378: Error: The type "boost::STATIC_ASSERTION_FAILURE<0>" is incomplete.
"/opt/solarisstudio12.4/lib/compilers/include/CC/stlport4/stl/_algo.c", line 436: Error: The function "lrand48" must have a prototype.
"/usr/include/stdlib.h", line 113: Error: putenv(char*) was declared before with a different language.
"libs/atomic/src/lockpool.cpp", line 74: Error: "}" expected instead of ",".
"libs/context/src/unsupported.cpp", line 7: Error: #error "platform not supported".
"libs/log/src/date_time_format_parser.cpp", line 399: Error: Linker scopes may not change after symbol definition.
"libs/log/src/date_time_format_parser.cpp", line 412: Error: Linker scopes may not change after symbol definition.

IMO, любой достойный компилятор C++ должен иметь возможность создавать Boost, поскольку я вряд ли могу представить какой-либо серьезный проект C++ без библиотек Boost. Поэтому мне просто интересно, читает ли это разработчик Boost или Solaris Studio и помогает ли мне с некоторыми исправлениями...

Большое спасибо за любые подсказки!


person Laryx Decidua    schedule 17.12.2014    source источник
comment
Вы пробовали предложения для компилятора Sun Studio на странице boost 1.57? увеличение. org/doc/libs/1_57_0/doc/html/bbv2/   -  person Alexandru C.    schedule 17.12.2014
comment
Я боюсь, что эти предложения относятся к гораздо более старым версиям компилятора. Например, ссылка на Sun C++ Frontend Tales не работает. Похоже, разработчики Boost больше не проводят активное тестирование Solaris Studio. Я хотел помочь (см. boost.org/development/running_regression_tests.html), но это тоже не работает, объект process_jam_log не может быть скомпилирован. Это происходит задолго до того, как можно будет запустить какой-либо из реальных тестов. Выглядит не очень :-/   -  person Laryx Decidua    schedule 17.12.2014


Ответы (1)


Первое, что нужно знать о сборке Boost с помощью Solaris Studio, это то, что файл Jam не обновлялся более 5 лет и использует STLport в качестве стандартной библиотеки C++. Это может быть не то, что вы хотите. Solaris Studio 12.4 может работать в режиме C++11, где для предоставления стандартной библиотеки используется GNU libstdc++. Даже если вы работаете в режиме C++03 по умолчанию, вы, вероятно, захотите использовать стандартную библиотеку Apache C++. Если вы не используете STLport для остального кода C++, задайте другой вопрос об изменении файлов Boost Jam для Solaris Studio для использования другой стандартной библиотеки.

Переходя к конкретным сообщениям об ошибках, которые вы видите, я думаю, что все они в архивной библиотеке имеют одну и ту же причину, и это легко исправить. Отредактируйте boost/archive/detail/register_archive.hpp и измените строку 31 с:

#ifdef __SUNPRO_CC

to:

#if 0

Давным-давно кто-то добавил обходной путь для ошибки в старой версии Solaris Studio, но теперь Solaris Studio 12.4 считает код обходного пути недействительным, но может справиться с кодом, который видят все остальные компиляторы.

Для сообщения «платформа не поддерживается» из контекстной библиотеки вам не повезло, если вы работаете в Solaris, но, возможно, это не имеет значения, если вы не используете эту конкретную библиотеку Boost.

Ошибки «Области компоновщика не могут измениться после определения символа» вызваны попыткой использовать директивы видимости символов Solaris. Я думаю, что разработчикам Boost было бы лучше удалить их, учитывая, что они больше не тестируют Solaris, потому что видимость по умолчанию является глобальной, и, по крайней мере, это работает. Чтобы сделать все символы глобальными и избежать этих проблем, отредактируйте boost/config/compiler/sunpro_cc.hpp и удалите следующие строки:

//
// Dynamic shared object (DSO) and dynamic-link library (DLL) support
//
#if __SUNPRO_CC > 0x500
#  define BOOST_SYMBOL_EXPORT __global
#  define BOOST_SYMBOL_IMPORT __global
#  define BOOST_SYMBOL_VISIBLE __global
#endif

а также отредактируйте libs/math/build/Jamfile.v2 и удалите эту строку:

<toolset>sun:<cxxflags>-xldscope=hidden

Для последних нескольких ошибок, которые вы вставили, требуется больше контекста, чтобы увидеть, откуда они взялись.

person dmr195    schedule 23.01.2015
comment
Большое спасибо за очень подробные комментарии. Я попробую ваши предложения в ближайшие несколько дней и отпишусь здесь - к сожалению, я сейчас очень занят менее интересными вещами :-) - person Laryx Decidua; 26.01.2015