【发布时间】:2014-09-29 23:47:17
【问题描述】:
我有一个使用 CodeLite 在 Windows 8.1 上使用 MinGW32 成功构建的项目。我正在尝试将编译器从 MinGW32 更改为 clang。但是,切换编译器后,出现以下错误:
c:/MinGW/lib/gcc/mingw32/4.8.1/include/c++\bits/stringfwd.h:74:33: error: use of undeclared identifier 'char16_t'
...其次是许多其他类似性质的人。因此,我尝试制作一个更简单的程序来检查该程序是否只是在我的代码中,并且我对 MinGW32 感到“幸运”。
以下程序也出现同样的错误:
#include <iostream>
int main(int argc, char **argv)
{
std::cout << "Hello World" << std::endl;
return 0;
}
在 CodeLite 中,设置了以下编译器选项(这些选项在编译器之间没有改变):
-g;-O0;-Wall;-std=c++11
为了确定,我还尝试在工作区级别检查 Enable C++11 Standard (clang) 框。
在网上搜索了一番,发现如下问题:
Build fails on clang errors. #762
因此,我尝试将-fno-ms-compatibility 添加到我的编译器选项中。这似乎确实有效果,因为编译器错误更改为:
c:/MinGW/lib/gcc/mingw32/4.8.1/include/c++\bits/char_traits.h:391:7: error: cannot mangle this built-in char16_t type yet
我也尝试使用流行的搜索引擎来找到解决方案,但我只能找到一个名为 MicrosoftMangle.cpp 的文件中的引用。这是提到我遇到的错误的部分:
void MicrosoftCXXNameMangler::mangleType(const BuiltinType *T,
SourceRange Range) {
// <type> ::= <builtin-type>
// <builtin-type> ::= X # void
// ::= C # signed char
// ::= D # char
// ::= E # unsigned char
// ::= F # short
// ::= G # unsigned short (or wchar_t if it's not a builtin)
// ::= H # int
// ::= I # unsigned int
// ::= J # long
// ::= K # unsigned long
// L # <none>
// ::= M # float
// ::= N # double
// ::= O # long double (__float80 is mangled differently)
// ::= _J # long long, __int64
// ::= _K # unsigned long long, __int64
// ::= _L # __int128
// ::= _M # unsigned __int128
// ::= _N # bool
// _O # <array in parameter>
// ::= _T # __float80 (Intel)
// ::= _W # wchar_t
// ::= _Z # __float80 (Digital Mars)
switch (T->getKind()) {
case BuiltinType::Void: Out << 'X'; break;
case BuiltinType::SChar: Out << 'C'; break;
case BuiltinType::Char_U: case BuiltinType::Char_S: Out << 'D'; break;
case BuiltinType::UChar: Out << 'E'; break;
case BuiltinType::Short: Out << 'F'; break;
case BuiltinType::UShort: Out << 'G'; break;
case BuiltinType::Int: Out << 'H'; break;
case BuiltinType::UInt: Out << 'I'; break;
case BuiltinType::Long: Out << 'J'; break;
case BuiltinType::ULong: Out << 'K'; break;
case BuiltinType::Float: Out << 'M'; break;
case BuiltinType::Double: Out << 'N'; break;
// TODO: Determine size and mangle accordingly
case BuiltinType::LongDouble: Out << 'O'; break;
case BuiltinType::LongLong: Out << "_J"; break;
case BuiltinType::ULongLong: Out << "_K"; break;
case BuiltinType::Int128: Out << "_L"; break;
case BuiltinType::UInt128: Out << "_M"; break;
case BuiltinType::Bool: Out << "_N"; break;
case BuiltinType::WChar_S:
case BuiltinType::WChar_U: Out << "_W"; break;
#define BUILTIN_TYPE(Id, SingletonId)
#define PLACEHOLDER_TYPE(Id, SingletonId) \
case BuiltinType::Id:
#include "clang/AST/BuiltinTypes.def"
case BuiltinType::Dependent:
llvm_unreachable("placeholder types shouldn't get to name mangling");
case BuiltinType::ObjCId: Out << "PAUobjc_object@@"; break;
case BuiltinType::ObjCClass: Out << "PAUobjc_class@@"; break;
case BuiltinType::ObjCSel: Out << "PAUobjc_selector@@"; break;
case BuiltinType::OCLImage1d: Out << "PAUocl_image1d@@"; break;
case BuiltinType::OCLImage1dArray: Out << "PAUocl_image1darray@@"; break;
case BuiltinType::OCLImage1dBuffer: Out << "PAUocl_image1dbuffer@@"; break;
case BuiltinType::OCLImage2d: Out << "PAUocl_image2d@@"; break;
case BuiltinType::OCLImage2dArray: Out << "PAUocl_image2darray@@"; break;
case BuiltinType::OCLImage3d: Out << "PAUocl_image3d@@"; break;
case BuiltinType::OCLSampler: Out << "PAUocl_sampler@@"; break;
case BuiltinType::OCLEvent: Out << "PAUocl_event@@"; break;
case BuiltinType::NullPtr: Out << "$$T"; break;
case BuiltinType::Char16:
case BuiltinType::Char32:
case BuiltinType::Half: {
DiagnosticsEngine &Diags = Context.getDiags();
unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
"cannot mangle this built-in %0 type yet");
Diags.Report(Range.getBegin(), DiagID)
<< T->getName(Context.getASTContext().getPrintingPolicy())
<< Range;
break;
}
}
}
此时,我对如何解决我的问题一无所知,因此提出了这个问题。提前感谢您为我提供的任何帮助!
其他信息
我意识到我仍然在这里使用 MinGW32 包含目录,这是故意的,因为 this tutorial on CodeLite 建议我这样做。
【问题讨论】:
-
VC++ 还没有
char16_t和char32_t的基本类型——目前它们只是其他基本类型的类型定义——所以它们还不是MS ABI 的一部分。因此,如果 clang 期望 ABI 区分例如char16_t和unsigned short,那么出错就对了。 -
@ildjarn 我没有打算混合 VC++ 和 MinGW32,尽管从你所说的情况来看似乎是这样。我对 CodeLite 也不是很熟悉(最近才开始使用它),或者 clang;有解决方案吗?感谢您迄今为止所做的努力。
-
我不知道 如何 完成您需要做的事情,所以我无法发布正确的答案,但根本问题是:在 Windows 上,clang可以使用 libstdc++ 或 VC++ 的标准库。您的 clang 副本显然配置为使用 libstdc++,它期望例如
char16_t是与unsigned short不同的类型,但在 VC++ 中它们是同一类型。我强烈怀疑,如果您使用 VC++ 的标准库,那么一切都会到位(您需要避免使用-fno-ms-compatibility)。 -
@ildjarn 非常感谢,这至少给了我一些关于从这里去哪里的方向。
-
可悲的是,this page 暗示这还不可能(我不知道可能在树干 3.5 的顶端)。
标签: c++ c++11 compiler-errors clang codelite