2015-09-08 3 views
2

Я хочу использовать clang для Windows для компиляции кода C.Является ли clang автономным компилятором C или ему нужен gcc?

Я хотел бы знать, является ли это на самом деле автономным компилятором, который может это сделать, или его цели несколько отличаются?

Я использовал его раньше, но теперь кажется, что это была копия поверх всех компиляторов gcc, которые лежали вокруг (например, mingw).

Если я попробую свежую двоичную установку clang 64-битных (и я спрячу свои каталоги mingw/gcc), то он не сможет найти stdio.h для Hello World. Это выполняется непосредственно из каталога bin (C: \ clang \ bin). Если я отобразите MinGW, он будет собирать, но я получаю ошибки, как это (один MinGW компилятор в C: \ победа):

C: \ победа \ Bin \ ld.exe не может найти -lgcc_s

Учитывая, что clang - это установка 438 МБ, вы бы подумали, что у нее будут свои собственные файлы include и library! Я хочу использовать clang на месте gcc.

Итак, что я делаю неправильно? (Я видел несколько вопросов также о неспособности найти stdio.h, но они не были полезны. Конечно, clang должен иметь возможность самостоятельно компилировать Hello World ?!)

+1

Это ... нагло ложно. FreeBSD полностью использует Clang и вообще не использует GCC (и не устанавливает GCC больше). – cyphar

+0

Ни Clang, ни GCC не содержат библиотеки C. Однако вы развертываете их, там будет отдельная библиотека C. –

ответ

0

Clang - полностью отдельный компилятор (написанный полностью с нуля, с использованием LLVM). Вам не нужен GCC для использования Clang, как это можно показать в случае FreeBSD (они полностью заменили GCC на Clang/LLVM и больше не устанавливали GCC на базе по причинам лицензирования). Существует множество различных компиляторов C, отличных от GCC, а именно GCC является наиболее распространенным.

Однако компилятор не предоставляет стандартные библиотеки C (GCC предоставляет некоторые странные библиотеки, такие как те, которые вы пытаетесь использовать). Библиотеки C предоставляются отдельно, и вам необходимо установить библиотеки C, чтобы скомпилировать любую значительную программу на C. Сообщение об ошибке cannot find -lgcc_s сообщает мне, что вы пытаетесь установить связь с некоторой библиотекой, предоставляемой GCC. В этом случае, вы, вероятно, хотите установить эту библиотеку путем установки GCC (но учтите, что вы не нужно GCC использовать Clang.

Это действительно кажется, что ваша версия Clang была скомпилирована для использования GNU привязанного ld , не LLVM привязанный lld. Таким образом, вы будете нуждаться в компоновщик GCC (или вы можете перекомпилировать лязг использовать компоновщик LLVM, либо просто скомпилировать объектные файлы и использовать lld отдельно).

+0

Вы уверены, что зависимость компоновщика по умолчанию ** скомпилирована ** в бинарник компилятора? Это звучит как безумно бесполезный выбор для меня. – IInspectable

0

вы путаете компилятор с линкером со стандартным библиотека

Clang - полнофункциональный независимый компилятор, но он не обеспечивает st andard library (библиотека, содержащая stdio.h). Традиционно в системах Unix операционные системы должны предоставлять стандартную библиотеку, которую он использует. Но поскольку вы используете Windows, это не так, и по какой-либо причине он находит те, что установлены MingW. Существует множество бесплатных реализаций стандартной библиотеки C, которые совместимы с Clang.

Наконец, ld.exe является компоновщиком, и он также традиционно должен предоставляться системой. Существует один компоновщик, lld, который, как я полагаю, разрабатывается вместе с Clang, но по какой-то причине, упаковщик загруженной вами версии просто решил настроить clang, чтобы просто вызвать ld.

+0

Я использовал другие компиляторы C, такие как DMC, Pelles C, lccwin и TinyCC, а также gcc. Все они имеют свои собственные заголовки, собственные линкеры и собственные файлы библиотек. Вы говорите, что clang не соответствует этому шаблону (несмотря на его массовый размер по сравнению с большинством из них)? Существует lld-программа, но она довольно странная и даже не распознает файл hello.o, созданный clang! – bartc

+0

Да. Он не подходит для готового к использованию шаблона пакета Windows. И Gcc не вписывается в структуру компиляторов, о которых вы упомянули. MingW (который содержит сборку GCC) может, но не GCC. У него даже нет официального бинарного распространения. – lvella

+0

Кстати, продукт Digital Mars называется «C и C++ Development System» и содержит гораздо больше, чем компилятор. – lvella

Смежные вопросы