clang 和 __float128 错误/错误

Posted

技术标签:

【中文标题】clang 和 __float128 错误/错误【英文标题】:clang and __float128 bug/error 【发布时间】:2012-11-23 09:02:18 【问题描述】:

我已经成功编译了当前 3.3 的 clang 分支。但是随后任何文件的 C++ 编译都会因错误/错误而失败。可以解决吗?

In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/iostream:39:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/ostream:39:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/ios:40:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/char_traits.h:40:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/stl_algobase.h:65:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/stl_pair.h:61:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/move.h:57:
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/type_traits:256:39: error: use of
      undeclared identifier '__float128'
    struct __is_floating_point_helper<__float128>
                                      ^
1 error generated.

【问题讨论】:

你看过这个:mail-archive.com/gcc-patches@gcc.gnu.org/msg31724.html? 你确定 clang 3.3 支持 __float128 吗? @Adriano 是的,我看到了,但不知道有没有进展。 @Martin:你找不到定义 _GLIBCXX_USE_FLOAT128 的标题并自己添加建议的编辑吗? 我刚刚将-std=gnu++0x 更改为-std=c++0x,它对我有用。不知道为什么!带有 gcc 4.8 工具链的 Clang 3.3。也许在过去一年左右情况发生了变化。 【参考方案1】:

您可以使用以下方法修复它:

CXXFLAGS+="-D__STRICT_ANSI__"

【讨论】:

这对我不起作用(llvm/clang 3.7.1 和 mingw 4.9.3 posix dwarf) 为我工作,在项目定义后将 set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -D__STRICT_ANSI__") 添加到 CmakeLists.txt。我正在使用 llvm/clang 4.0.1 和 mingw 7.1 x86_64 posix seh【参考方案2】:

我不认为clang 支持__float128。它可能long double 的类型相同(clang 中的 16 个字节)所以它可能是一个简单的插入情况:

#define __float128 long double

或:

typedef long double __float128;

包含链的早期位置。

我不保证它会起作用,但它可能会起作用,最好尝试一下,而不是等到clang 开始支持更多gcc 扩展。

要么,要么切换到gcc,如果这是一个选项。我很确定gcc 支持所有gcc 扩展:-)

【讨论】:

其实这是一个不错的计划,快速 -D"__float128=long double" 可能会解决问题... 这可能是clang中的一个错误。这并不奇怪,因为 3.3 是当前的开发分支,而 3.2 甚至还没有发布。 OP 几乎是在使用实验代码。 Clang 应该与 GCC 的 C++ 库一起使用。 不!由于模板规范重新声明,它不起作用,但我找到了解决方案;-) 但我同意这是一个错误。 如果 clang 声明他们支持它,这只是一个错误。否则,这只是实现上的差异 - ISO C 中没有强制支持该类型。【参考方案3】:

请参阅http://llvm.org/bugs/show_bug.cgi?id=13530#c3 了解可能的解决方法。

【讨论】:

【参考方案4】:

解决方案是有这个声明。它就像一个魅力:

#ifdef __clang__
typedef struct  long double x, y;  __float128;
#endif

由于模板规范重新声明错误,#define 的解决方案不起作用。

当然,这是一个黑客,你必须安全。我想clang只是做一些实验,所以不会造成任何麻烦。

【讨论】:

只是出于兴趣,您为什么需要structtypedef long double __float128; 有什么问题? @paxdiablo 有两个模板规范(已经),例如:template &lt;__float128&gt;template &lt;long double&gt;。使用 typedef 你有冲突。 我遇到了同样的问题,因为我使用 Clang 3.2 和 -std=gnu++11 编译了我的代码。在我更改为 -std=c++11 后,它解决了问题。 我想应该是typedef struct double x, y; __float128;吧?只有这样,sizeof(__float128) 在 GCC 和 Clang 中才会评估为 16。 @9emE0iL18gxCqLT 谢谢!这就像一个奇迹!

以上是关于clang 和 __float128 错误/错误的主要内容,如果未能解决你的问题,请参考以下文章

SSE:从 const __m128 * 转换为 const float *

模拟器clang上的Xcode构建错误:错误:没有这样的文件或目录:'__entitlements'

gtest:架构 x86_64 的未定义符号与 clang++ 和 std::vector 错误

带有 -mavx 标志的链接器错误 GCC7

clang __asm__在case statment中使用标签,得到错误:指令操作数无效。

未定义符号 RealmSwift:“_OBJC_CLASS_$_RLMNotificationToken”,clang 错误