如何使用Solaris Studio 12.4编译器构建Boost V1.57

时间:2014-12-17 12:08:46

标签: c++ boost solaris-studio

我尝试在Intel Solaris V11.2平台上使用全新的Solaris Studio 12.4编译器构建Boost V1.57。我试图在OTN development forum上发布错误但事实证明我的简单OTN帐户不允许我添加新帖子。因此,问题是SO。

简要总结: 1)Bootstrapping没问题了:

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,因为我很难想象没有Boost库的任何严肃的C ++项目。所以我只是想知道Boost或Solaris Studio开发人员是否读了这个并帮助我修补了一些补丁......

非常感谢任何提示!

1 个答案:

答案 0 :(得分:2)

首先要了解如何使用Solaris Studio构建Boost,Jam文件已更新5年以上,并使用STLport作为其C ++标准库。这可能不是你想要的。 Solaris Studio 12.4可以在C ++ 11模式下运行,它使用GNU libstdc ++来提供其标准库。即使您在默认的C ++ 03模式下运行,您也可能希望使用Apache C ++标准库。如果您没有将STLport用于其余的C ++代码,那么请询问有关更改Solaris Studio的Boost Jam文件以使用其他标准库的其他问题。

继续查看您所看到的确切错误消息,我认为归档库中的所有错误消息都有相同的原因,并且很容易修复。编辑boost / archive / detail / register_archive.hpp并从以下位置更改第31行:

#ifdef __SUNPRO_CC

为:

#if 0

很久以前有人为旧版本的Solaris Studio中的错误添加了一种解决方法,但现在Solaris Studio 12.4发现解决方法代码无效,但可以处理所有其他编译器看到的代码。

对于不支持&#34;平台&#34;来自上下文库的消息,如果您在Solaris上,那么您将失去运气,但如果您不使用此特定的Boost库,那么这可能并不重要。

&#34;链接器范围在符号定义后可能不会改变&#34;尝试使用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

对于您粘贴的最后几个错误,需要更多上下文来查看它们的来源。