Boost 1.64 在 solaris 上构建错误

Posted

技术标签:

【中文标题】Boost 1.64 在 solaris 上构建错误【英文标题】:Boost 1.64 build error on solaris 【发布时间】:2017-06-30 10:09:10 【问题描述】:
<built-in>: note: this is the location of the previous definition
In file included from /usr/include/limits.h:12:0,
                 from /export/home/user/gcc-6.2.0.bin/lib/gcc/i386-pc-solaris2.11/6.2.0/include-fixed/limits.h:168,
                 from /export/home/user/gcc-6.2.0.bin/lib/gcc/i386-pc-solaris2.11/6.2.0/include-fixed/syslimits.h:7,
                 from /export/home/user/gcc-6.2.0.bin/lib/gcc/i386-pc-solaris2.11/6.2.0/include-fixed/limits.h:34,
                 from ./boost/log/detail/config.hpp:33,
                 from libs/log/src/attribute_set.cpp:16:
/export/home/user/gcc-6.2.0.bin/lib/gcc/i386-pc-solaris2.11/6.2.0/include-fixed/sys/feature_tests.h:363:2: error: #error "Compiler or options invalid for pre-UNIX 03 X/Open applications       and pre-2001 POSIX applications"
 #error "Compiler or options invalid for pre-UNIX 03 X/Open applications \
  ^~~~~

"g++"  -ftemplate-depth-128 -O3 -finline-functions -Wno-inline -Wall -march=i686 -pthreads -m32 -fno-strict-aliasing -ftemplate-depth-1024 -fvisibility=hidden -DBOOST_ALL_NO_LIB=1 -DBOOST_ATOMIC_STATIC_LINK=1 -DBOOST_CHRONO_STATIC_LINK=1 -DBOOST_FILESYSTEM_STATIC_LINK=1 -DBOOST_LOG_BUILDING_THE_LIB=1 -DBOOST_LOG_USE_AVX2 -DBOOST_LOG_USE_SSSE3 -DBOOST_LOG_WITHOUT_DEBUG_OUTPUT -DBOOST_LOG_WITHOUT_EVENT_LOG -DBOOST_LOG_WITHOUT_IPC -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -DBOOST_SYSTEM_NO_DEPRECATED -DBOOST_SYSTEM_STATIC_LINK=1 -DBOOST_THREAD_BUILD_LIB=1 -DBOOST_THREAD_DONT_USE_CHRONO=1 -DBOOST_THREAD_POSIX -DBOOST_THREAD_USE_LIB=1 -DDATE_TIME_INLINE -DNDEBUG -D_XOPEN_SOURCE=500 -D__EXTENSIONS__ -D__STDC_CONSTANT_MACROS  -I"." -I"libs/log/src" -c -o "bin.v2/libs/log/build/gcc-6.2.0/release/link-static/threading-multi/attribute_set.o" "libs/log/src/attribute_set.cpp"

...failed gcc.compile.c++ bin.v2/libs/log/build/gcc-6.2.0/release/link-static/threading-multi/attribute_set.o...
gcc.compile.c++ bin.v2/libs/log/build/gcc-6.2.0/release/link-static/threading-multi/attribute_value_set.o
<command-line>:0:0: warning: "_XOPEN_SOURCE" redefined
<built-in>: note: this is the location of the previous definition
In file included from /usr/include/limits.h:12:0,
                 from /export/home/user/gcc-6.2.0.bin/lib/gcc/i386-pc-solaris2.11/6.2.0/include-fixed/limits.h:168,
                 from /export/home/user/gcc-6.2.0.bin/lib/gcc/i386-pc-solaris2.11/6.2.0/include-fixed/syslimits.h:7,
                 from /export/home/user/gcc-6.2.0.bin/lib/gcc/i386-pc-solaris2.11/6.2.0/include-fixed/limits.h:34,
                 from ./boost/log/detail/config.hpp:33,
                 from libs/log/src/attribute_value_set.cpp:16:
/export/home/user/gcc-6.2.0.bin/lib/gcc/i386-pc-solaris2.11/6.2.0/include-fixed/sys/feature_tests.h:363:2: error: #error "Compiler or options invalid for pre-UNIX 03 X/Open applications       and pre-2001 POSIX applications"
 #error "Compiler or options invalid for pre-UNIX 03 X/Open applications \
  ^~~~~

"g++"  -ftemplate-depth-128 -O3 -finline-functions -Wno-inline -Wall -march=i686 -pthreads -m32 -fno-strict-aliasing -ftemplate-depth-1024 -fvisibility=hidden -DBOOST_ALL_NO_LIB=1 -DBOOST_ATOMIC_STATIC_LINK=1 -DBOOST_CHRONO_STATIC_LINK=1 -DBOOST_FILESYSTEM_STATIC_LINK=1 -DBOOST_LOG_BUILDING_THE_LIB=1 -DBOOST_LOG_USE_AVX2 -DBOOST_LOG_USE_SSSE3 -DBOOST_LOG_WITHOUT_DEBUG_OUTPUT -DBOOST_LOG_WITHOUT_EVENT_LOG -DBOOST_LOG_WITHOUT_IPC -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -DBOOST_SYSTEM_NO_DEPRECATED -DBOOST_SYSTEM_STATIC_LINK=1 -DBOOST_THREAD_BUILD_LIB=1 -DBOOST_THREAD_DONT_USE_CHRONO=1 -DBOOST_THREAD_POSIX -DBOOST_THREAD_USE_LIB=1 -DDATE_TIME_INLINE -DNDEBUG -D_XOPEN_SOURCE=500 -D__EXTENSIONS__ -D__STDC_CONSTANT_MACROS  -I"." -I"libs/log/src" -c -o "bin.v2/libs/log/build/gcc-6.2.0/release/link-static/threading-multi/attribute_value_set.o" "libs/log/src/attribute_value_set.cpp"

...failed gcc.compile.c++ bin.v2/libs/log/build/gcc-6.2.0/release/link-static/threading-multi/attribute_value_set.o...
gcc.compile.c++ bin.v2/libs/log/build/gcc-6.2.0/release/link-static/threading-multi/code_conversion.o
<command-line>:0:0: warning: "_XOPEN_SOURCE" redefined




...skipped <pbin.v2/libs/log/build/gcc-6.2.0/release/threading-multi>libboost_log.so.1.64.0 for lack of <pbin.v2/libs/log/build/gcc-6.2.0/release/threading-multi>attribute_name.o...
...skipped <pstage/lib>libboost_log.so.1.64.0 for lack of <pbin.v2/libs/log/build/gcc-6.2.0/release/threading-multi>libboost_log.so.1.64.0...
...skipped <pstage/lib>libboost_log.so for lack of <pstage/lib>libboost_log.so.1.64.0...
                 from ./boost/log/detail/config.hpp:33,
                 from ./boost/log/detail/setup_config.hpp:20,
                 from ./boost/log/detail/config.hpp:33,
                 from ./boost/log/detail/setup_config.hpp:20,
                 from ./boost/log/detail/config.hpp:33,
                 from ./boost/log/detail/setup_config.hpp:20,
                 from ./boost/log/detail/config.hpp:33,
                 from ./boost/log/detail/setup_config.hpp:20,
                 from ./boost/log/detail/config.hpp:33,
                 from ./boost/log/detail/setup_config.hpp:20,
                 from ./boost/log/detail/config.hpp:33,
                 from ./boost/log/detail/setup_config.hpp:20,
                 from ./boost/log/detail/config.hpp:33,
                 from ./boost/log/detail/setup_config.hpp:20,
                 from ./boost/log/detail/config.hpp:33,
                 from ./boost/log/detail/setup_config.hpp:20,
                 from ./boost/log/detail/config.hpp:33,
                 from ./boost/log/detail/setup_config.hpp:20,
...skipped <pbin.v2/libs/log/build/gcc-6.2.0/release/threading-multi>libboost_log_setup.so.1.64.0 for lack of <pbin.v2/libs/log/build/gcc-6.2.0/release/threading-multi>setup/parser_utils.o...
...skipped <pstage/lib>libboost_log_setup.so.1.64.0 for lack of <pbin.v2/libs/log/build/gcc-6.2.0/release/threading-multi>libboost_log_setup.so.1.64.0...
...skipped <pstage/lib>libboost_log_setup.so for lack of <pstage/lib>libboost_log_setup.so.1.64.0...

在使用 GCC 6.2 版本构建 Boost C++ Libraries 1.64 时有一些错误日志。有什么问题? 它是众多错误日志之一。

$b2

这发生在执行上述命令期间。日志和 python 库有大量的错误日志。

不知道为什么会出现这个错误。

构建环境 Oracle Solaris 11.2 x86 2014 年 6 月 23 日 GCC 6.2 构建目标 Boost C++ 库 1.64

【问题讨论】:

【参考方案1】:

我认为您在 feature_test.h 中检查了这一块标准:

#if defined(_STDC_C99) && (defined(__XOPEN_OR_POSIX) && !defined(_XPG6))
#error "Compiler or options invalid for pre-UNIX 03 X/Open applications \
        and pre-2001 POSIX applications"
#elif !defined(_STDC_C99) && \
        (defined(__XOPEN_OR_POSIX) && defined(_XPG6))
#error "Compiler or options invalid; UNIX 03 and POSIX.1-2001 applications \
        require the use of c99"
#endif

这是第一个触发的#error。

UNIX 标准有许多(令人困惑的)名称,POSIX、Xopen、IEEE XPG、SUS。在使用 Single Unix Standard 3 (SUSv3) C90 之前。 SUSv3 及以后使用 C99。 g++ 6.2,默认为 C++ 的 C++14 也设置了 c11 标志 (#define __STDC_VERSION__ 201112L)

所有这一切的结果是您可能需要设置 _XPG6 宏。通常你不直接这样做,你应该将 _XOPEN_SOURCE 设置为 600,我看到它在你的命令行中设置为 500。

【讨论】:

这似乎是一个 Boost 错误。 Per the comments in sys/feature_tests.h:“使用 c99 编译 XPG3、XPG4、XPG4v2 或 XPG5 应用程序是无效的。...”A Google search for "c99 and xpg5" 产生了许多结果 - 修复似乎是正确定义 _XOPEN_SOURCE=600。找到该行为的实际 POSIX 引用会很好。 这更像是 Solaris 标头被破坏的情况。头文件检查 C 标准版本,但 C++ 编译器不必定义任何 C 版本宏。形式上,这使得系统头文件与 C++ 不兼容。接下来是_XOPEN_SOURCE=500与C99不兼容的绝对不合理的限制。一个是强制使用 C89+_XOPEN_SOURCE=500 或 C99+_XOPEN_SOURCE=600。 IMO,需要修复的是 Solaris 标头。 @AndreySemashev 这更像是 Solaris 标头被破坏的情况。头文件检查 C 标准版本,但 C++ 编译器不必定义任何 C 版本宏。 您没有阅读头文件。 src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/sys/… GCC 将 C 版本宏定义为 C99 或更高版本。听起来像是 GCC 问题,而不是 Boost 问题。 我的观点是C++标准没有定义__STDC_VERSION__,这是一个C语言宏,见[cpp.predefined]/2。符合标准的编译器不需要定义它,也可以将它定义为它想要的任何值。在系统头文件中检查它意味着与 C++ 不兼容。 这不是像 IEEE 这样的标准机构的工作方式。他们有一套当前的标准,所有旧标准都已弃用。没有“嗯,它是 99% 向后兼容的”。它可能没有引起您的注意,但 Solaris SUSv3 兼容,而大多数 Linix 发行版不兼容。编译部分中的这个文档docs.oracle.com/cd/E19253-01/816-5175/standards-5/index.html 似乎提出了相当严格的要求。当然,如果您对 Open Group/IEEE 标准不满意,您可以加入它们并尝试改变它们。【参考方案2】:

正如在 Paul Floyd 的回答之后的讨论中发现的那样,Solaris 标头与 C++ 不兼容,这会导致您看到的错误。

这可以通过修改 Boost.Log 源,libs/log/build/Jamfile.v2,第 256 行来解决。从这里更改它:

<target-os>solaris:<define>_XOPEN_SOURCE=500

到这里:

<target-os>solaris:<define>_XOPEN_SOURCE=600

(为简洁起见,我删除了评论)。

在 Boost 1.65 中,该库应尝试自动解决该问题,因此不需要进行此修改。

【讨论】:

以上是关于Boost 1.64 在 solaris 上构建错误的主要内容,如果未能解决你的问题,请参考以下文章

boost1.44.0 文件系统 v3 无法在 solaris sparc 64bit 平台上正常运行

在 Linux 上构建 Solaris 软件包?

可以在没有 boost 或 C++11 的情况下使用 Asio 吗?

如何交叉编译solaris 32位

在 windows 上配置 boost 构建

如何在 mingw64 上使用 boost.test 构建测试?