Откуда берется символ __1 при использовании libC++ от LLVM?
Я вижу довольно много вопросов, таких как Ошибка Apple Mach-O Linker (Id) и Неопределенные символы в cryptopp в 64-битном проекте IOS. Проблема обычно описывается как:
Undefined symbols for architecture i386:
"std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()", referenced from:
cv::gpu::error(char const*, char const*, int, char const*) in opencv2(gpumat.o)
Проблема часто сводится к смешиванию / сопоставлению -stdlib=libc++
(Среда выполнения LLVM C++) и -stdlib=libstdc++
(Среда выполнения GNU C++). Среда выполнения LLVM C++ (libc++
) имеет __1
символ украшения, но среда выполнения GNU C++ libstdc++
не хватает __1
символ в его названии. Это вызывает проблемы компоновщика для символов, которые, кажется, имеют то же имя (например, std::string
).
Где __1
откуда взялись символы libC++ от LLVM?
Почему проблема не была решена с gnu
пространство имен и llvm
Пространство имен?
Вот связанный с этим вопрос: libC++ - прекратить переименование std в std::__1?, Но он как бы упускает из виду тот факт, что переименование не происходит.
1 ответ
Это из C++11 встроенных пространств имен
В libC++ есть что-то вроде
namespace std {
inline namespace __1 {
....
подробнее на Для чего нужны встроенные пространства имен?