На моем компьютере с Windows 10 установлен clang, и когда я выполняю «clang --version», я получаю следующую информацию:
Но насколько я знаю, msvc — это отдельный компилятор, с помощью которого можно собрать проект (например, на языке C). Какова цель clang, если он использует msvc? могу ли я изменить цель?
Спасибо
Это цель, для которой компилируется clang. Clang не поставляется в Windows со стандартной библиотекой, поэтому ему приходится использовать либо компоновщик Microsoft Visual C и стандартную библиотеку Microsoft, либо компоновщик Gnu gcc и стандартную библиотеку Gnu.
Итак, ваша цель говорит: «Скомпилировать для 64-разрядной версии Windows Intel и связать ее с компоновщиком Microsoft и стандартными библиотеками». Альтернативная цель — x86_64-pc-windows-gnu
. Это будет работать, только если у вас установлен gcc.
Вывод 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
Я думаю, это относится к тому, какая среда выполнения C была связана с компилятором. См. stackoverflow.com/questions/67848972/…