Próbuję cross-kompilacji aplikacji C z Linux (64-bit) do Windows (64-bit) za pomocą Clang. Przeczytałem numer page on cross-compilation, który nie był zbyt pomocny.Cross-kompilacja z Linux do Windows z Clang
Jako prosty test, mam następujący kod w test.c
:
#include <stdio.h>
int main()
{
puts("hello world");
return 0;
}
Mój najlepszy przypuszczenie tak daleko jest clang -o test -target x86_64-win64-?ABI? test.c
. Jednak nie mam pojęcia, czego używa system ABI Windows 64 bit. Kiedy uruchomię klang z docelowym potrójnym x86_64-win64-abcdefg
, wydaje się, że kompiluje się dobrze - to znaczy kończy się bezbłędnie i powoduje coś, co jest nieco poprawnym plikiem binarnym. To nie ma sensu, biorąc pod uwagę, że abcdefg
zdecydowanie nie jest prawidłowym ABI. Wynikowy plik binarny jest o wiele za duży dla tak małego programu, a Windows wydaje się myśleć o 16-bitowym programie (???). Demontaż go ujawnia odniesienia do "linux" i "gnu", więc wydaje się, że Clang nawet nie próbuje skompilować dla Windows.
kierowania win32 (x86_64-win32-???ABI???
) wyniki w następujący komunikat o błędzie:
test.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
^
1 error generated.
Ten błąd, jeśli się nie mylę, jest wynikiem tego, nie wiedząc, gdzie szukać plików systemowych. Zakładam, że Clang może przechowywać pliki nagłówkowe Windows gdzieś, ponieważ twierdzi, że jest w stanie dokonać krzyżowej kompilacji; ale gdzie? Jeśli nie, czy mogę gdzieś je pobrać?
Czy istnieje lista wszystkich architektur, systemów i podpór ABI firmy Clang? Lista na stronie kompilacji krzyżowej nie jest wyczerpująca.
Strona sugeruje również użycie -mcpu=...
, ale ostrzeżenie sugeruje, że jest nieaktualna. Zamiast tego, jak zaleca ostrzeżenie, próbowałem -mtune=x86_64
. To wydaje się nie mieć żadnego skutku. Czy jest to nawet konieczne, biorąc pod uwagę, że architektura jest określona w potrójnym celu?
Widziałem literaturę, która sugeruje, że potrzebuję lld
, eksperymentalnego linkera LLVM. Czy tak jest? Miałem problemy z kompilacją Lld i chciałbym tego uniknąć, jeśli to możliwe.
"_Jeśli wybierzesz parametr, którego Clang nie zna, np. Blerg, zignoruje i przyjmie nieznany, co nie zawsze jest pożądane, więc bądź ostrożny." "I prawdopodobnie to się stało, gdy wybrałeś' abcdefg' . – DyZ
@DYZ ah okay, dziękuję. Gdyby istniała lista poprawnych parametrów lub jakiś komunikat wskazujący, że nie wie! – RogueCSDev
nie jest odpowiedzią, ale znalazłem https://github.com/tpoechtrager/wclang - jeszcze tego nie próbowałem. "Łatwo przekompiluj kod źródłowy dla Windows z clang na Linux/Unix" –