Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 每个libstdc和x2B的“GLIBCXX”值+;释放_C++_Linux_Libstdc++ - Fatal编程技术网

C++ 每个libstdc和x2B的“GLIBCXX”值+;释放

C++ 每个libstdc和x2B的“GLIBCXX”值+;释放,c++,linux,libstdc++,C++,Linux,Libstdc++,宏\uuuu GLIBCXX\uuuu包含libstdc++发行版的时间戳,例如来自gcc文档() \uuuu GLIBCXX\uuuuu 压缩ISO日期格式的libstdc++的当前版本,作为无符号长字符。有关特定版本中此特定宏的值的详细信息,请参阅ABI政策和指南附录 我正在寻找自4.9.0发布以来所有版本的值(包括较小版本的版本,如4.8.x) libstdc++的文档似乎没有提供这些信息(它只提供了GCC4.7.0之前的日期) 在哪里可以找到\uuu GLIBCXX\uuu的值?有人有吗

\uuuu GLIBCXX\uuuu
包含libstdc++发行版的时间戳,例如来自gcc文档()

\uuuu GLIBCXX\uuuuu
压缩ISO日期格式的libstdc++的当前版本,作为无符号长字符。有关特定版本中此特定宏的值的详细信息,请参阅ABI政策和指南附录

我正在寻找自4.9.0发布以来所有版本的值(包括较小版本的版本,如4.8.x)

libstdc++的文档似乎没有提供这些信息(它只提供了GCC4.7.0之前的日期)

在哪里可以找到
\uuu GLIBCXX\uuu
的值?有人有吗

ABI政策和指南附录()中说

库预定义宏的增量缓冲。对于3.4.0之前的版本,宏为GLIBCPP。对于以后的版本,它是GLIBCXX。(libstdc++项目在其整个源代码中慷慨地从CPP更改为CXX,以允许“C”预处理器使用CPP宏名称空间。)这些宏以压缩ISO日期格式定义为库发布的日期,作为无符号长字符

但随后仅提供GCC 4.7.0之前的宏值。此处仍然列出了特定GCC发布的日期:


但例如,对于发布日期为“2014年7月16日”的GCC 4.9.1,ISO日期格式为20140716,
\uuuu GLIBCXX\uuuu
的值为20140617(请注意,7和6已切换)。

您想要的信息无论如何都是无用的,因此您应该以不同的方式解决问题

GCC 4.9.3是在GCC 5.3之后发布的,因此该宏中的日期较晚,因此您不能只执行以下操作:

#if __GLIBCXX__ > 20150422 // GCC 5.1 release
因为这对于4.9.3来说是正确的,但它并没有5.1所具有的所有特性


大多数GNU/Linux发行版也不提供正式的FSF版本,它们构建快照,其中包含快照的日期,而快照的日期不在任何发布日期列表中。而5.x分支在给定日期的快照将与6.x分支在给定日期的快照具有相同的日期,因此您无法区分它们。

为了回答原始问题,下面是一个hacky命令,您可以在shell中执行,以获取每个版本的发布列表和
\uu\GLIBCXX\uu
值(从v4.1.0开始):

svn列表”svn://gcc.gnu.org/svn/gcc/tags“|grep-o”gcc|([^34]| 4|[^0]|.*)|发布“| xargs-n1-I{}sh-c”printf“{}:\”和&svn cat”svn://gcc.gnu.org/svn/gcc/tags/{}/gcc/DATESTAMP“
结果是:

  • 4.1.0:
  • 4.1.1:
  • 4.1.2:
  • 4.2.0:
  • 4.2.1:
  • 4.2.2:
  • 4.2.3:
  • 4.2.4:
  • 4.3.0:
  • 4.3.1:
  • 4.3.2:
  • 4.3.3:
  • 4.3.4:
  • 4.3.5:
  • 4.3.6:
  • 4.4.0:
  • 4.4.1:
  • 4.4.2:
  • 4.4.3:
  • 4.4.4:
  • 4.4.5:
  • 4.4.6:
  • 4.4.7:
  • 4.5.0:
  • 4.5.1:
  • 4.5.2:
  • 4.5.3:
  • 4.5.4:
  • 4.6.0:
  • 4.6.1:
  • 4.6.2:
  • 4.6.3:
  • 4.6.4:
  • 4.7.0:
  • 4.7.1:
  • 4.7.2:
  • 4.7.3:
  • 4.7.4:
  • 4.8.0:
  • 4.8.1:
  • 4.8.2:
  • 4.8.3:
  • 4.8.4:
  • 4.8.5:
  • 4.9.0:
  • 4.9.1:
  • 4.9.2:
  • 4.9.3:
  • 5.1.0:
  • 5.2.0:
  • 5.3.0:
  • 6.1.0:
  • 6.2.0:
  • 6.3.0:
  • 6.4.0:
  • 7.1.0:
  • 7.2.0:
  • 7.3.0:

请注意,这些值来自GCC团队的官方版本。如果您使用的是非官方版本,则值可能略有不同。

您可以使用SVN版本列表作为源,生成一个可能的
\uuuu GLIBCXX\uuu
列表:

svn list --xml 'https://gcc.gnu.org/svn/gcc/tags' \
    | grep '>gcc.*release' -A4 \
    | grep 'name\|date' \
    | sed -e 's/<[^>]\+>//g' -e 's/T.*$//' -e 's/-//g' \
          -e 's/gcc_\|_release//g'  \
    | paste - -
因此,不幸的是,您不能使用单个日期作为简单的截止值来确定某个版本

当然,您可以从该列表自动生成一些辅助宏。假设-您需要一些4.8 GLIBCXX版本的变通方法(由GCC和不同的clang版本使用),然后您可以像这样定义一个helper宏(包括一些STL头):


如果您只对主要版本感兴趣,并且只需要支持比GCC 7更新的版本,那么您也可以使用
\u GLIBCXX\u发行版

,您确定v4.9.1版本的
\u GLIBCXX\uu
20140617
?因为消息来源说应该是。在我的系统中,它输出20140617。奇怪。这意味着你使用的是20140617的快照,而不是FSF的官方版本。@JonathanWakely谢谢,这样做会使我的价值毫无用处。我打了你的电话,你是“权威的”:P和哇,这正是我试图解决的问题。在4.9.x版本中,缺少
是很平常的,但是在>5.x版本中它的存在(耦合)
4_8_0   20130322
4_8_1   20130531
4_8_2   20131016
4_8_3   20140522
4_8_4   20141219
4_8_5   20150623
4_9_0   20140422
4_9_1   20140716
4_9_2   20141030
4_9_3   20150626
4_9_4   20160803
#if        __GLIBCXX__ == 20130322 \
        || __GLIBCXX__ == 20130531 \
        || __GLIBCXX__ == 20131016 \
        || __GLIBCXX__ == 20140522 \
        || __GLIBCXX__ == 20141219 \
        || __GLIBCXX__ == 20150623
    #define HAVE_GLIBCXX_4_8     1
#else
    #define HAVE_GLIBCXX_4_8     0
#endif