每个 libstdc++ 版本的 `__GLIBCXX__` 的值
Value of `__GLIBCXX__` for each libstdc++ release
宏 __GLIBCXX__
包含 libstdc++ 版本的时间戳,例如来自 gcc 文档 (https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_macros.html)
__GLIBCXX__
The current version of libstdc++ in compressed ISO date format, as an unsigned long. For details on the value of this particular macro for a particular release, please consult the ABI Policy and Guidelines appendix.
我正在寻找自 4.9.0 发布以来所有版本的值(包括较小版本的版本,如 4.8.x)。
libstdc++ 的文档似乎没有提供此信息(它只提供了 gcc 4.7.0 之前的日期)。
在哪里可以找到 __GLIBCXX__
的值?有人有吗?
ABI 政策和指南附录 (https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html) 说
Incremental bumping of a library pre-defined macro. For releases before 3.4.0, the macro is GLIBCPP. For later releases, it's GLIBCXX. (The libstdc++ project generously changed from CPP to CXX throughout its source to allow the "C" pre-processor the CPP macro namespace.) These macros are defined as the date the library was released, in compressed ISO date format, as an unsigned long.
但随后仅提供 GCC 4.7.0 之前的宏值。此处列出了特定 GCC 发布的日期:
https://gcc.gnu.org/releases.html
但例如对于发布日期为 "July 16, 2014" 的 GCC 4.9.1,ISO 日期格式为 20140716,__GLIBCXX__
的值为 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 中执行以获取版本列表和每个版本的 __GLIBCXX__
值(从 v4 开始.1.0):
svn list "svn://gcc.gnu.org/svn/gcc/tags" | grep -o "gcc_\([^34]_.*\|4_[^0]_.*\)_release" | xargs -n 1 -I {} sh -c "printf \"{}: \" && svn cat svn://gcc.gnu.org/svn/gcc/tags/{}/gcc/DATESTAMP"
结果是:
- 4.1.0: 20060228
- 4.1.1: 20060524
- 4.1.2: 20070214
- 4.2.0: 20070514
- 4.2.1: 20070719
- 4.2.2: 20071007
- 4.2.3: 20080201
- 4.2.4: 20080519
- 4.3.0: 20080305
- 4.3.1: 20080606
- 4.3.2: 20080827
- 4.3.3: 20090124
- 4.3.4: 20090804
- 4.3.5: 20100522
- 4.3.6: 20110627
- 4.4.0: 20090421
- 4.4.1: 20090722
- 4.4.2: 20091015
- 4.4.3: 20100121
- 4.4.4: 20100429
- 4.4.5: 20101001
- 4.4.6: 20110416
- 4.4.7: 20120313
- 4.5.0: 20100414
- 4.5.1: 20100731
- 4.5.2: 20101216
- 4.5.3: 20110428
- 4.5.4: 20120702
- 4.6.0: 20110325
- 4.6.1: 20110627
- 4.6.2: 20111026
- 4.6.3: 20120301
- 4.6.4: 20130412
- 4.7.0: 20120322
- 4.7.1: 20120614
- 4.7.2: 20120920
- 4.7.3: 20130411
- 4.7.4: 20140612
- 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
- 5.1.0: 20150422
- 5.2.0: 20150716
- 5.3.0: 20151204
- 6.1.0: 20160427
- 6.2.0: 20160822
- 6.3.0: 20161221
- 6.4.0: 20170704
- 7.1.0: 20170502
- 7.2.0: 20170814
- 7.3.0: 20180125
请注意,这些值来自 GCC 团队的官方发布。如果您使用的是非官方版本,这些值可能会略有不同。
您可以使用 SVN 发布列表作为来源生成可能的 __GLIBCXX__
values 列表:
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 - -
GCC 团队维护了一个类似的列表,但格式更自由,并使用分支 ascii 艺术进行注释:
https://gcc.gnu.org/develop.html#timeline
请注意,多个发布分支同时处于活动状态,例如4.8 和 4.9 分支:
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
因此,很遗憾,您不能使用单个日期作为简单的截止值来确定某个版本。
当然,您可以从此列表中自动生成一些辅助宏。说 - 你需要一些 4.8 GLIBCXX 版本的解决方法(GCC 和不同的 clang 版本使用)然后你可以定义一个像这样的辅助宏(在包含一些 STL 头之后):
#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
如果您只对主要版本感兴趣并且只需要支持比 GCC 7 更新的版本,您也可以使用 _GLIBCXX_RELEASE
macro.
宏 __GLIBCXX__
包含 libstdc++ 版本的时间戳,例如来自 gcc 文档 (https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_macros.html)
__GLIBCXX__
The current version of libstdc++ in compressed ISO date format, as an unsigned long. For details on the value of this particular macro for a particular release, please consult the ABI Policy and Guidelines appendix.
我正在寻找自 4.9.0 发布以来所有版本的值(包括较小版本的版本,如 4.8.x)。
libstdc++ 的文档似乎没有提供此信息(它只提供了 gcc 4.7.0 之前的日期)。
在哪里可以找到 __GLIBCXX__
的值?有人有吗?
ABI 政策和指南附录 (https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html) 说
Incremental bumping of a library pre-defined macro. For releases before 3.4.0, the macro is GLIBCPP. For later releases, it's GLIBCXX. (The libstdc++ project generously changed from CPP to CXX throughout its source to allow the "C" pre-processor the CPP macro namespace.) These macros are defined as the date the library was released, in compressed ISO date format, as an unsigned long.
但随后仅提供 GCC 4.7.0 之前的宏值。此处列出了特定 GCC 发布的日期:
https://gcc.gnu.org/releases.html
但例如对于发布日期为 "July 16, 2014" 的 GCC 4.9.1,ISO 日期格式为 20140716,__GLIBCXX__
的值为 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 中执行以获取版本列表和每个版本的 __GLIBCXX__
值(从 v4 开始.1.0):
svn list "svn://gcc.gnu.org/svn/gcc/tags" | grep -o "gcc_\([^34]_.*\|4_[^0]_.*\)_release" | xargs -n 1 -I {} sh -c "printf \"{}: \" && svn cat svn://gcc.gnu.org/svn/gcc/tags/{}/gcc/DATESTAMP"
结果是:
- 4.1.0: 20060228
- 4.1.1: 20060524
- 4.1.2: 20070214
- 4.2.0: 20070514
- 4.2.1: 20070719
- 4.2.2: 20071007
- 4.2.3: 20080201
- 4.2.4: 20080519
- 4.3.0: 20080305
- 4.3.1: 20080606
- 4.3.2: 20080827
- 4.3.3: 20090124
- 4.3.4: 20090804
- 4.3.5: 20100522
- 4.3.6: 20110627
- 4.4.0: 20090421
- 4.4.1: 20090722
- 4.4.2: 20091015
- 4.4.3: 20100121
- 4.4.4: 20100429
- 4.4.5: 20101001
- 4.4.6: 20110416
- 4.4.7: 20120313
- 4.5.0: 20100414
- 4.5.1: 20100731
- 4.5.2: 20101216
- 4.5.3: 20110428
- 4.5.4: 20120702
- 4.6.0: 20110325
- 4.6.1: 20110627
- 4.6.2: 20111026
- 4.6.3: 20120301
- 4.6.4: 20130412
- 4.7.0: 20120322
- 4.7.1: 20120614
- 4.7.2: 20120920
- 4.7.3: 20130411
- 4.7.4: 20140612
- 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
- 5.1.0: 20150422
- 5.2.0: 20150716
- 5.3.0: 20151204
- 6.1.0: 20160427
- 6.2.0: 20160822
- 6.3.0: 20161221
- 6.4.0: 20170704
- 7.1.0: 20170502
- 7.2.0: 20170814
- 7.3.0: 20180125
请注意,这些值来自 GCC 团队的官方发布。如果您使用的是非官方版本,这些值可能会略有不同。
您可以使用 SVN 发布列表作为来源生成可能的 __GLIBCXX__
values 列表:
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 - -
GCC 团队维护了一个类似的列表,但格式更自由,并使用分支 ascii 艺术进行注释:
https://gcc.gnu.org/develop.html#timeline
请注意,多个发布分支同时处于活动状态,例如4.8 和 4.9 分支:
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
因此,很遗憾,您不能使用单个日期作为简单的截止值来确定某个版本。
当然,您可以从此列表中自动生成一些辅助宏。说 - 你需要一些 4.8 GLIBCXX 版本的解决方法(GCC 和不同的 clang 版本使用)然后你可以定义一个像这样的辅助宏(在包含一些 STL 头之后):
#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
如果您只对主要版本感兴趣并且只需要支持比 GCC 7 更新的版本,您也可以使用 _GLIBCXX_RELEASE
macro.