【问题标题】:How to detect the libstdc++ version in Clang?如何在 Clang 中检测 libstdc++ 版本?
【发布时间】:2014-03-04 13:24:29
【问题描述】:

我想用 Clang 编写一个“便携式”C++ 库。 “可移植”意味着我(在 C 预处理器中)检测编译环境中可用的 C++ 功能并使用这些功能或提供我的解决方法。这类似于 Boost 库正在做的事情。

但是,某些功能的存在并不取决于语言,而是取决于标准库的实现。我特别感兴趣:

  • 类型特征(其中哪些可用以及使用何种拼写)
  • 如果initializer_listconstexpr

我发现这是有问题的,因为默认情况下 Clang 不使用自己的标准库实现:它使用 libstdc++。虽然 Clang 已经预定义了预处理器宏 __GNUC____GNUC_MINOR____GNUC_PATCHLEVEL__,但它们分别被硬编码为值 4、2、1,并且它们很少告诉我有关可用的 libstdc++ 功能的信息。

我如何在 Clang 预处理器中检查它正在使用哪个版本的 libstdc++?

【问题讨论】:

  • 所以您得出的结论是,主要因素是标准库实现,但您想检测编译器版本?你的逻辑到底是什么? libstdc++gcc分发,它仍然是一个不同的项目,没有什么让你认为你可以将 libstdc++ 的版本精确定位到特定的发布 gcc。
  • 如果我知道标准库(即 libstdc++)中存在某些内容,我想有条件地编译一些代码(即通过预处理器指令禁用一些代码)。我想用预处理器宏来检测库中是否存在某些东西,或者通过其他有助于我检测到的方式。如果没有这样的方法,那也可以很好地回答我的问题。
  • @Andrzej 我不确定这将如何工作。如果您的标准库实现不支持某个功能或有错误代码,那么它将没有该功能或无法按您期望的方式工作。如果标准库中不存在备用实现,您可以在此处查找其他问题,向您展示如何使用它。
  • 我可能没有清楚地表达我的意图。我正在用@remyabel 编写一个类:3 个成员函数:f1、f2、f3。如果我知道某些标准库功能已损坏或不存在,我希望我的类只有两个函数 f1 和 f2。我不想要 f3,因为它必须使用损坏的功能。
  • @user2485710:现在我明白你在说什么了。你说得对。 GCC 版本是个坏主意,我应该要求的是 libstdc++ 版本。

标签: c++ clang c-preprocessor


【解决方案1】:

我认为这会有所帮助。它打印 _LIBCPP_VERSION 宏的值:

#include <iostream>
#include <string>

using namespace std;

int main(int argc, const char * argv[])
{
    cout<<"Value = "<<_LIBCPP_VERSION<<endl;
    return 0;
}

再次编译你想要信息的clang版本。

【讨论】:

  • 请注意,您必须通过将-stdlib=libc++ 传递给clang++ 来链接到Linux 系统上的libc++
【解决方案2】:

Clang 有它自己的标准库实现,它被称为libc++。您可以通过在编译命令中添加-stdlib=libc++ 来使用它。

话虽如此,有多种方法可以检查 Clang/libstdc++ C++ 支持:

  1. Clang 具有 __has_feature 宏(和朋友),可用于检测语言功能和语言扩展。
  2. Libstdc++ 有自己的版本宏,请参阅the documentation。不过,您需要包含一个 libstdc++ 标头才能定义这些。
  3. GCC 具有您已经发现的版本宏,但需要手动与文档进行比较。

而且,这花了我 2 分钟的谷歌搜索时间。

【讨论】:

  • __GLIBCXX__ - 这就是我要找的。谢谢。
  • 如链接文档中所述,__GLIBCXX__ 不是版本号的单调函数,4.4.0 的版本号比 4.3.6 小得多,这使得它很难用于检查功能。
  • Boost 正在使用 clang: svn.boost.org/trac/boost/ticket/7473 更新其对 libstdc++ 版本的检测(它将使用 __has_include 检查已知已添加到库的每个版本中的标头)。
  • 我认为使用 GLIBCXX 不是区分 libstdc++ 功能的有用方法。例如,我需要属于 C++11 的 trait std::is_trivially_copy_constructible,但很长时间以来 gcc 还没有与 4 版本的编译器一起发布,所以,你可以使用 gcc 4.9 具有损坏特征的东西,并且GLIBCXX 比 gcc 5 的旧版本更高,因此更小 GLIBCXX
猜你喜欢
  • 2014-02-19
  • 2017-03-22
  • 2013-10-23
  • 2014-04-27
  • 2015-10-08
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多