Я пытаюсь перекрестно скомпилировать приложения C из Linux (64 бит) в Windows (64 бит) с помощью Clang. Я прочитал page on cross-compilation, что было не слишком полезно.Перекрестная компиляция из Linux в Windows с помощью Clang
В качестве простого теста, у меня есть следующий код в test.c
:
#include <stdio.h>
int main()
{
puts("hello world");
return 0;
}
Моя догадка до сих пор clang -o test -target x86_64-win64-?ABI? test.c
. Однако я понятия не имею, что использует ABI Windows 64 бит. Когда я запускаю clang с целевой тройкой x86_64-win64-abcdefg
, он, похоже, компилируется отлично - то есть он заканчивается без ошибок и приводит к чему-то, что является несколько действительным двоичным кодом. Это не имеет никакого смысла, учитывая, что abcdefg
определенно недействителен ABI. Получающийся двоичный файл слишком большой для такой небольшой программы, и Windows, похоже, считает, что это 16-разрядная программа (???). Разборка в нем показывает ссылки на «linux» и «gnu», поэтому казалось бы, что Clang даже не пытается скомпилировать для Windows.
таргетирования win32 (x86_64-win32-???ABI???
) приводит следующее сообщение об ошибке:
test.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
^
1 error generated.
Эта ошибка, если я не ошибаюсь, является результатом этого, не зная, где искать системные файлы. Я предполагаю, что Clang хранит файлы заголовков Windows где-то, так как он утверждает, что способен перекрестно компилировать; но где? Если этого не произойдет, есть ли где-нибудь я могу их скачать?
Есть ли список всех архитектур, систем и поддерживающих ABA Clang? Список на странице кросс-компиляции не является исчерпывающим.
На странице также предлагается использовать -mcpu=...
, но предупреждение указывает на то, что оно устарело. Вместо этого, как рекомендует предупреждение, я попробовал -mtune=x86_64
. Это, кажется, не имеет никакого эффекта. Это даже необходимо, учитывая, что архитектура указана в целевой тройке?
Я видел литературу, которая предлагает мне lld
, экспериментальный линкер LLVM. Это так? У меня возникли проблемы с компиляцией lld и хотелось бы избежать этого, если это возможно.
«Если вы выберете параметр, который Clang не знает, например, blerg, он будет игнорировать и предположить неизвестное, что не всегда желательно, поэтому будьте осторожны.» «И это, вероятно, произошло, когда вы выбрали' abcdefg' , – DyZ
@ DYZ ах ладно, спасибо. Если только был список допустимых параметров или какое-то сообщение, чтобы указать, что он не знает! – RogueCSDev
не ответ, но я нашел https://github.com/tpoechtrager/wclang - еще не пробовал. «Кросс-компиляция исходного кода легко для Windows с clang на Linux/Unix» –