Подтвердить что ты не робот

Кланг в Windows

Прежде всего, я следил за "Начало работы: создание и запуск Clang" . В частности, я построил его в соответствии с разделом "Использование Visual Studio". Другими словами, я создал его с помощью Visual Studio 2010.

Во-вторых, я вручную установил пути включения и библиотеки в дистрибутив MinGW:

enter image description here

Простая программа, которую я пытаюсь скомпилировать:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, World!" << endl;
    return 0;
}

Я получаю следующие отзывы от компилятора:

In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\iostream:39:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\ostream:39:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\ios:38:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\iosfwd:41:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\bits/postypes.h:41:
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:144:11: error: no member named 'fgetws' in the global namespace
  using ::fgetws;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:146:11: error: no member named 'fputws' in the global namespace
  using ::fputws;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:150:11: error: no member named 'getwc' in the global namespace
  using ::getwc;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:151:11: error: no member named 'getwchar' in the global namespace
  using ::getwchar;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:156:11: error: no member named 'putwc' in the global namespace
  using ::putwc;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:157:11: error: no member named 'putwchar' in the global namespace
  using ::putwchar;
        ~~^
6 errors generated.
Build error occurred, build is stopped
Time consumed: 646  ms.  

Очевидный вопрос: зачем я это получаю?

Кроме того, я хотел бы узнать более подробную информацию, и поскольку сайт Clang предоставляет чрезвычайно краткую информацию - я думал, что кто-то может прояснить мне следующие вопросы:

  • Насколько я понимаю, Clang не имеет своей собственной стандартной библиотеки (stdС++, я думаю, не так ли?). Вот почему я должен использовать заголовки и библиотеки MinGW - я прав?
  • В чем разница между построением Clang с Visual Studio и MinGW?
  • Нужно ли мне жестко кодировать пути в clang/lib/Frontend/InitHeaderSearch.cpp, или я могу пропустить его и скорее указать эти пути позже через параметр "-I", как показано на скриншоте выше?
4b9b3361

Ответ 1

Если вы создадите Clang с помощью MSVS, он автоматически будет искать пути включения VS по умолчанию и вытащить эти заголовки. Именно по этой причине заголовки libstdС++ создают ошибки: они импортируют функции C, отсутствующие в заголовках VS. Использование Clang для С++ с VS на данный момент является не-go: вы получите сбои ссылок из-за отсутствия функций ABI (название и другие) в Clang. Если вы все еще хотите использовать MSVS Clang, не указывайте его на заголовки MinGW. Он будет анализировать заголовки VS (включая С++), он просто не сможет ссылаться.


EDIT. Я построил версию GCC (только 32-разрядную версию) dw2, сопровождаемую Clang. Исключения работают в этой сборке, поэтому вы можете создавать реальные С++ файлы с Clang теперь в Windows. Получить версию 3.2 здесь.

Ответ 2

Очевидный ответ: вы забыли отправить -fno-ms-совместимость с clang++: P

  • Вы правы.
  • VС++ - это инструментальная цепочка GUI, MinGW - консоль символов.
  • Нет, поскольку clang достаточно зрел для общественного потребления, но все еще стабилизируется, поэтому пусть его команда разработчиков работает над кодом, иначе вы рискуете работать, которая может стать потерянным островом. Я использую -I, как показывает ваш пример.

Я делаю Windows app dev с помощью VS и использую clang + CodeBlocks для совместного использования аспектов, нейтральных для домена платформы.