Откуда берется символ __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 {
        ....

подробнее на Для чего нужны встроенные пространства имен?

Другие вопросы по тегам