Можно ли скомпилировать исходники C ++ с заголовками Clang 3.1 плюс VC11 Beta?

Я пытаюсь скомпилировать довольно простую программу "hello world", используя заголовки stl с clang в окнах, и я не могу этого сделать.

Я без проблем скомпилировал Clang 3.1 из репозитория с помощью VC11 Beta. Теперь я пытаюсь использовать уже скомпилированный Clang для компиляции образца "hello world" с использованием заголовков VC11, но я получаю кучу ошибок, которые, кажется, показывают, что Clang теряется с некоторой магией макросов для имитированных вариативных шаблонов на VC11, хотя Я не использую эту макро-магию напрямую.

Мои подключаемые каталоги:

  • C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ include
  • C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ atlmfc \ include
  • C: \ Program Files (x86) \ Комплекты Windows \ 8.0 \ Включить \ um
  • C: \ Program Files (x86) \ Windows Kits \ 8.0 \ Include \ общий
  • C: \ Program Files (x86) \ Windows Kits \ 8.0 \ Include \ winrt

Я получаю такие ошибки, как:

C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ include \ xstddef: 1094: 24: ошибка: '_Nil' не относится к значению

И куча других, связанных с макросами.

Кто-нибудь смог решить эту проблему с макросами? Есть ли проблема с препроцессором clang при экспортировании этого макроса?


person pepper_chico    schedule 12.04.2012    source источник
comment
Помимо макросов, это не сработает, поскольку Clang не обрабатывает __declspec.   -  person ildjarn    schedule 12.04.2012
comment
@ildjarn Итак, я думаю, что заголовки не заполнены __declscpec, с VC10 я смог без проблем скомпилировать тот же источник, используя заголовок iostream (и другие заголовки из VC10).   -  person pepper_chico    schedule 12.04.2012
comment
@Chico: Это потому, что VC10 понимает __declspec. Clang - нет.   -  person Nicol Bolas    schedule 12.04.2012
comment
@NicolBolas извините, я хотел сказать с заголовками VC10. Предположите ту же конфигурацию, что и представленная проблема, только меняя версии компилятора, и я не получаю этих проблем.   -  person pepper_chico    schedule 12.04.2012


Ответы (2)


Заголовки Microsoft C ++ включают расширения и особенности, которые еще не поддерживаются. Clang может создавать программы с заголовками C в Windows, но не с заголовками C ++.

Поскольку среда выполнения C работает, вы можете использовать другую стандартную библиотеку C ++, которая полагается только на среду выполнения C. Я не пробовал, но, возможно, таким образом можно использовать libc ++.

person bames53    schedule 12.04.2012
comment
Я смог скомпилировать с заголовками VC10. Отсутствует первоклассная поддержка libc ++ в Windows. Если есть какая-то особенность, я хочу точно знать, что это. - person pepper_chico; 12.04.2012
comment
@Chico Я не очень старался, но clang++ -std=c++11 file.cpp с исходным кодом #include <vector> приводил к множеству ошибок, таких как error: unknown type name '__m256'. - person bames53; 12.04.2012
comment
Что ж, может быть, у меня какой-то пробел в памяти ... Я просто помню, как без особых проблем компилировал тривиальные образцы C ++ с clang, используя эти заголовки. - person pepper_chico; 12.04.2012

Я очень уверен, что вы не сможете использовать clang для компиляции некоторых заголовков, таких как C: \ Program Files (x86) \ Windows Kits \ 8.0 \ Include \ winrt. Причина в том, что Windows 8 предлагает версию C ++ с некоторым расширением. Эта версия получила название C ++ / CX.

Некоторые расширения (например, ref class) не являются стандартными C ++. Я считаю, что это вызывает сообщения при сборке, в которых говорится, что вы пытаетесь скомпилировать некоторые вариативные шаблоны.

person Claudio Junior    schedule 12.04.2012
comment
Расширения, относящиеся к WinRT, в данном случае не являются проблемой, я их не использую, а также проблема, похоже, не связана с этим. Думаю, я мог бы вообще удалить этот каталог include. - person pepper_chico; 12.04.2012
comment
Вы уверены, что в заголовках нет ни одного из этих расширений? Я видел речь, произнесенную парнем по имени Карут из команды clang, и они сказали, что clang пока недоступен для Windows из-за нескольких проблем. - person Claudio Junior; 13.04.2012
comment
Да, C ++ / CX используется в некоторых файлах заголовков, но такое использование всегда ограничивается #ifdef __cplusplus_winrt. В противном случае заголовки нельзя будет использовать в программах, не использующих /ZW. Аналогично для специфичных для C ++ / CLI функций в заголовках с помощью предопределенного макроса __cplusplus_cli. Эти языковые расширения не должны вызывать никаких проблем. - person James McNellis; 18.04.2012
comment
Однако, несомненно, есть и другие причины, по которым Clang не может использовать заголовки стандартной библиотеки Visual C ++. Среди других причин, заголовки зависят от многих функций Visual C ++ и Windows (например, встроенных функций компилятора, нестандартных функций библиотеки), и, по крайней мере, в некоторых местах код библиотеки может полагаться на несоответствующее поведение в компиляторе Visual C ++. - person James McNellis; 18.04.2012