【问题标题】:clang, std::function and -fno-rtti铿锵声、std::function 和 -fno-rtti
【发布时间】:2018-06-05 15:35:27
【问题描述】:

我在 Windows 上通过 clang-cl 使用 Clang 5,在使用 std::function 时尝试关闭运行时类型信息 (-fno-rtti) 时遇到问题。

这是我无法编译的示例:

#include <functional>

void foo(std::function<void()> ra2)
{
}

int main()
{
    auto bar = []()
    {
    };

    foo(bar);

    return EXIT_SUCCESS;
}

命令行:

clang-cl test.cpp -Xclang -fno-rtti

错误是:

C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.13.26128\include\functional(435,11):  error:
      cannot use typeid with -fno-rtti
                return (typeid(_Callable));
                        ^

这让我很吃惊,有没有办法在没有 RTTI 的情况下在 Clang 中将 std::function 与 lambdas 一起使用?文档说只有std::function 上的targettarget_type 应该需要RTTI。我可以推出自己的std::function 版本,但不得不这样做似乎很可惜。

如果我使用带有编译器标志 /GR- 的 MSVC,它工作正常。

【问题讨论】:

  • 这并不是因为 Clang 本身,而是因为使用了 MSVC 标准库,这显然需要std::function 的 RTTI。 MSVC 本身是否支持std::function 关闭 RTTI?如果是,则可能是 MSVC Clang 兼容性驱动程序中的错误。
  • +1 @tabre。它与libstdc++libc++ 都可以很好地编译(使用-fno-rtti)。 (Clang5)
  • @tambre,是的,它在 msvc 中编译时没有 RTTI(编译器标志 /GR-
  • @keith 尝试在编译器选项中或在包含任何标准库头文件之前将_HAS_STATIC_RTTI 定义为0。如果它有效,那么我非常确定这是 MSVC 的 Clang 兼容性驱动程序中的一个错误。
  • @keith 他们是。但是您使用的是EXIT_SUCCESS,它来自cstdlib。但是您实际上并没有包含cstdlib,这是保证定义EXIT_SUCCESS 的唯一标头。由于给定标准库的实现细节,您的代码仍然可以编译。从标准的角度来看,使代码可移植的修复方法是简单地包含cstdlib

标签: c++ c++11 clang clang-cl


【解决方案1】:

这是一个错误fixed in Clang 13


Clang MSVC 驱动程序未能将 _HAS_STATIC_RTTI 定义为 0,MSVC 标准库使用它来启用无 RTTI 代码。

作为一种解决方法,您可以使用编译器标志在全局范围内手动定义它,或者在包含任何标准库头文件之前对其进行定义。

【讨论】:

  • 不幸的是,此解决方法不再适用于最新版本的 MSVC 标准库 (c:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.12.25827/include/functional)。 #iftypeid(_Callable)typeid(void) 中进行选择,两者都会导致相同的错误cannot use typeid with -fno-rtti
  • 该错误可以通过使用 -Xclang -fno-rtti-data -D_HAS_STATIC_RTTI 0 当您传递 MS 样式 /GR- 标志时,clang-cl 驱动程序使用 -fno-rtti-data但默认情况下,clang++ 驱动程序不会公开它。所以需要 -Xclang 来强制驱动程序接受 -fno-rtti-data 参数。
  • 我刚刚在尝试在 windows 上直接调用 clang++ 设置 make 文件项目时遇到了这个问题。我添加了定义和 -Xclang -fno-rtti-data 标志,但仍然收到报告的错误
  • @Teknogrebo,它不适用于-fno-rtti -Xclang -fno-rtti-dataclang-cl.exe/GR- 标志转换为 -frtti -Xclang -fno-rtti-data
猜你喜欢
  • 2016-10-24
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多