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只是做一些实验,所以不会造成任何麻烦。
【讨论】:
只是出于兴趣,您为什么需要struct
? typedef long double __float128;
有什么问题?
@paxdiablo 有两个模板规范(已经),例如:template <__float128>
和 template <long double>
。使用 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 错误
clang __asm__在case statment中使用标签,得到错误:指令操作数无效。
未定义符号 RealmSwift:“_OBJC_CLASS_$_RLMNotificationToken”,clang 错误