Почему clang связан с msvc в Windows?

На моем компьютере с Windows 10 установлен clang, и когда я выполняю «clang --version», я получаю следующую информацию:

Но насколько я знаю, msvc — это отдельный компилятор, с помощью которого можно собрать проект (например, на языке C). Какова цель clang, если он использует msvc? могу ли я изменить цель?

Спасибо

Я думаю, это относится к тому, какая среда выполнения C была связана с компилятором. См. stackoverflow.com/questions/67848972/…

Lundin 14.06.2024 12:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
109
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это цель, для которой компилируется clang. Clang не поставляется в Windows со стандартной библиотекой, поэтому ему приходится использовать либо компоновщик Microsoft Visual C и стандартную библиотеку Microsoft, либо компоновщик Gnu gcc и стандартную библиотеку Gnu.

Итак, ваша цель говорит: «Скомпилировать для 64-разрядной версии Windows Intel и связать ее с компоновщиком Microsoft и стандартными библиотеками». Альтернативная цель — x86_64-pc-windows-gnu. Это будет работать, только если у вас установлен gcc.

https://wetmelon.github.io/clang-on-windows.html

Ответ принят как подходящий

Вывод Target, который вы видите, говорит вам, что по умолчанию ваш clang компилятор выдаст код, двоично совместимый с кодом, созданным MSVC, и поэтому его можно связать с компоновщиком MS с библиотеками, скомпилированными с помощью MSVC.

Да, вы можете изменить цель, используя --target option.

Общие параметры кросс-компиляции в Clang

Целевой тройной

Основной вариант — определить целевую архитектуру. Для этого используйте -target <triple>. Если вы не укажете цель, имена процессоров не будут совпадать (поскольку Clang предполагает тройку хостов), и компиляция продолжится, создавая код для хост-платформы, который сломает позже при сборке или связывании.

Тройка имеет общий формат <arch><sub>-<vendor>-<sys>-<env>, где: Arch = x86_64, i386, рука, большой палец, mips и т. д.

суб = например. на ARM: v5, v6m, v7a, v7m и т. д.

поставщик = ПК, Apple, nvidia, IBM и т. д.

sys = нет, Linux, Win32, Дарвин, cuda и т. д.

env = eabi, gnu, android, мачо, эльф и т. д.

Например, мое значение по умолчанию:

$ clang --version
Ubuntu clang version 18.1.6 (++20240518023429+1118c2e05e67-1~exp1~20240518143527.144)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

$ cat main.c
int main(void)
{
    return 0;
}

$ clang -c main.c
$ file main.o
main.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

И я могу изменить цели следующим образом:

$ clang --version --target=x86_64-pc-windows-msvc
Ubuntu clang version 18.1.6 (++20240518023429+1118c2e05e67-1~exp1~20240518143527.144)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: /usr/bin

$ clang --target=x86_64-pc-windows-msvc -c main.c
$ file main.o
main.o: Intel amd64 COFF object file, not stripped, 6 sections, symbol offset=0x143, 16 symbols, created Fri Jun 14 13:09:59 2024, 1st section name ".text"

Это для совместимости с 64-битной Windows GCC.

$ clang --target=x86_64-pc-windows-gnu -c main.c
$ file main.o
main.o: Intel amd64 COFF object file, not stripped, 6 sections, symbol offset=0x162, 17 symbols, 1st section name ".text"

Это если для 64-битной macOS.

$ clang --target=x86_64-apple-darwin -c main.c
$ file main.o
main.o: Mach-O 64-bit x86_64 object, flags:<|SUBSECTIONS_VIA_SYMBOLS>

В каждом случае clang компилирует объектный файл соответствующего типа.

Чтобы скомпилировать и связать программу, даже такую ​​полезную, как Hello World, вам потребуется предоставить в распоряжение clang стандартные заголовочные файлы и библиотеки. и компоновщик для заданного или заданного по умолчанию целевого триплета. По сути, вам нужно будет иметь уже установил набор инструментов для этого целевого триплета, с помощью которого вы можете затем используйте clang в качестве компилятора. Для нативных сборок clang по умолчанию будет искать обычный набор инструментов для тройки хостов, для которой он был создан. При кросс-компиляции вы можете указать clang на внешний инструментарий. с опцией --sysroot. Еще раз смотрите Общие параметры кросс-компиляции в Clang

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