Кланг в Windows

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

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

введите здесь описание изображения

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

#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 предоставляет очень краткую информацию - я подумал, что кто-нибудь может прояснить мне следующие вопросы:

  1. Насколько я понимаю, у Clang нет собственной стандартной библиотеки (наверное, stdc++, не так ли?). Вот почему я должен использовать заголовки и библиотеки MinGW — я прав?
  2. В чем разница между созданием Clang с помощью Visual Studio и MinGW?
  3. Должен ли я жестко включать пути в clang/lib/Frontend/InitHeaderSearch.cpp или я могу пропустить это и указать эти пути позже с помощью опции «-I», как я делаю на скриншоте выше?

person Alexander Shukaev    schedule 16.01.2012    source источник
comment
Комбинация, которую я использовал в прошлом, состоит в том, чтобы изменить InitHeaderSearch.cpp, чтобы включить путь к моим включаемым папкам MinGW, а затем выполнить сборку с помощью цепочки инструментов MinGW. Мне также удалось выполнить сборку с помощью цепочки инструментов Visual C++, но я не смог понять, как заставить встроенный компилятор использовать заголовки и библиотеки из установки MinGW (заголовки стандартной библиотеки Visual C++ C++ не могут использоваться, потому что они в значительной степени полагаются на специфические функции Visual C++).   -  person James McNellis    schedule 16.01.2012
comment
Да, это именно то, о чем я думал. Но больше всего меня смущает то, как сборка с помощью Visual C++ или MinGW связана с путями включения и библиотек, используемыми при использовании компилятора Clang. Другими словами, я должен иметь возможность свободно выбирать эти пути после компиляции Clang. С какой стати эти пути зависят от компилятора, который я использовал для сборки Clang?   -  person Alexander Shukaev    schedule 16.01.2012
comment
@JamesMcNellis: в настоящее время Clang должен иметь возможность анализировать заголовки VC++. Единственная проблемная область синтаксического анализа — MFC IIRC.   -  person rubenvb    schedule 16.01.2012
comment
@ Haroogan Я полностью согласен с тем, что вы говорите. Я пытался заставить плагин clang работать с Sublime Text 2 в Windows, и странные проблемы с stdc++/header... ну, странные.   -  person Steven Lu    schedule 14.09.2012


Ответы (2)


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


EDIT: я создал версию GCC для dw2 (только 32-разрядная версия) в сопровождении Clang. В этой сборке работают исключения, так что теперь вы можете создавать настоящие вещи на C++ с помощью Clang в Windows. Загрузите версию 3.2 здесь.

person rubenvb    schedule 16.01.2012
comment
А что, если я вручную соберу его с помощью MinGW и добавлю пути вручную, как показано на скриншоте? - person Alexander Shukaev; 16.01.2012
comment
любой готовый бинарный пакет clang? - person Mr.Anubis; 16.01.2012
comment
@Mr.Anubis: да, у меня есть сборка Clang для Windows для каждой версии GCC, которую я создал. Вы просто не можете использовать его в одиночку. - person rubenvb; 16.01.2012
comment
@Haroogan: я даже не знаю, из какой программы сделан этот скриншот. В моем случае clang.exe — это полная замена gcc.exe, а clang++.exe — полная замена g++.exe. - person rubenvb; 16.01.2012
comment
Я имею в виду, что они готовы к использованию другими, такими как ваши двоичные файлы gcc? ссылки? - person Mr.Anubis; 16.01.2012
comment
@Mr.Anubis: пожалуйста, перейдите по ссылкам, которые я разместил, нажмите 4.6.3-1 и загрузите пакет ...gcc-4.6.3-1_rubenvb.7z и пакет ...clang-3.1-1_rubenvb.7z и извлеките их оба в один и тот же каталог. Остальное уже в моем ответе. - person rubenvb; 16.01.2012
comment
@rubenvb (1) Неважно, какая это программа. Дело в том, что при компиляции кода с помощью Clang он добавляет -I со всеми include-путями, которые там указаны. (2) Говоря о подстановке. Означает ли это, что когда вы создаете Clang с помощью MinGW, MinGW каким-то образом внедряет конфигурацию включения и пути к библиотеке в Clang? - person Alexander Shukaev; 16.01.2012
comment
@Haroogan: я внедрил пути включения MinGW-w64 в InitHeaderSearch.cpp и планирую поддерживать его до тех пор, пока этот код не будет заменен чем-то лучшим. Пути жестко закодированы в Clang. важно то, что это означает, что вам не нужно беспокоиться ни о чем из этого, и вы можете просто сделать clang somefile.c -o test.exe без необходимости добавлять стандартные пути включения в командную строку. То же самое и с GCC: он тоже знает, где находятся все его заголовки. - person rubenvb; 16.01.2012
comment
Хорошо, но, честно говоря, это беспорядок, когда официальное руководство по сборке Clang для Windows предлагает собрать его с помощью Visual Studio, зная, что затем он будет использовать стандартную библиотеку Visual C++, что немедленно приводит к эпическому провалу... - person Alexander Shukaev; 16.01.2012
comment
@Haroogan: видя, что обработка исключений нарушена, в любом случае нельзя делать ничего, кроме экспериментов. Как только Clang исправит свое имя, все станет лучше, но это не так. - person rubenvb; 16.01.2012
comment
не только исключение сломано, у меня есть исходные файлы, для которых оно просто зависает. - person Aftershock; 05.03.2012
comment
@rubenvb: можно ли использовать ваш пакет clang с TDM-MinGW64? - person Trass3r; 25.05.2012
comment
@ Trass3r Я удалил старую информацию. Ссылка в редактировании должна работать. Обратите внимание, что это сборка SVN, а не версия 3.1 в сочетании с GCC 4.6.3. Заголовки libstdc++ в режиме C++11 имеют некоторые проблемы, в остальном эта сборка работает нормально (с функциональной обработкой исключений!) - person rubenvb; 25.05.2012
comment
Хорошо, спасибо, но, как вы сказали, это может генерировать только 32-битный код, верно? Мне действительно интересно, как далеко продвинулся проект Clang Win64 SEH. О, и сборка SVN великолепна, мне всегда нравятся последние функции C ++ 11 :) - person Trass3r; 25.05.2012
comment
@rubenvb: Хотите поделиться шагами, необходимыми для воспроизведения вашей сборки? Было бы огромной помощью. - person marton78; 18.07.2012
comment
@ marton78 сценарии сборки включены в каждый исходный пакет, доступный на исходной версии MinGW-w64, сценарии также доступны отдельно на мой гитхаб. Для Clang это в основном configure && make. - person rubenvb; 02.01.2013

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

  1. Ты прав.
  2. VC++ — это инструментальная цепочка с графическим интерфейсом, MinGW — символьная консоль.
  3. Нет, так как clang достаточно зрелый для общественного потребления, но все еще должен стабилизироваться, поэтому пусть его команда разработчиков работает над кодом, иначе вы рискуете сделать работу, которая может стать потерянным островом. Я использую -I, как следует из вашего примера.

Я занимаюсь разработкой приложений для Windows с помощью VS и использую clang+CodeBlocks для обмена аспектами, нейтральными по отношению к домену платформы.

person Chawathe Vipul S    schedule 04.03.2013
comment
VC++ ‹-› MinGW. VС++ не является графическим интерфейсом. Он имеет интерфейс командной строки. - person rubenvb; 13.12.2013
comment
Цепочка инструментов GUI — это не GUI. Его набор инструментов с графическим интерфейсом включен в установку по умолчанию. - person Chawathe Vipul S; 20.12.2013