У меня есть проект, который успешно строится с использованием MinGW32 в Windows 8.1 с использованием CodeLite. Я пытаюсь изменить компилятор с 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)
на уровне рабочей области, просто чтобы быть уверенным.
После недолгих поисков в интернете нашел следующую проблему:
Сбой сборки из-за ошибок clang. #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, и это сделано намеренно как это руководство по CodeLite предложил мне сделать это.
char16_t
иchar32_t
— в настоящее время они являются просто определениями типов для других фундаментальных типов — поэтому они также еще не являются частью MS ABI. Следовательно, если clang ожидает, что ABI различает, например,char16_t
иunsigned short
, то правильно ошибиться. - person ildjarn   schedule 07.08.2014char16_t
должен быть типом, отличным отunsigned short
, но в VC++ это один и тот же тип. Я сильно подозреваю, что если вы заставите clang использовать стандартную библиотеку VC++, тогда все встанет на свои места (и вам нужно будет избегать-fno-ms-compatibility
). - person ildjarn   schedule 07.08.2014