2017-02-05 16 views
6

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.

+1

"_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

+0

@DYZ ah okay, dziękuję. Gdyby istniała lista poprawnych parametrów lub jakiś komunikat wskazujący, że nie wie! – RogueCSDev

+0

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" –

Odpowiedz

1

Zainstalowałem mobaxterm na moim komputerze z systemem Windows 10. Dostępna jest darmowa wersja. Zapewnia serwer xserver. Zawiera instalację cygwin i możesz uruchomić lokalny terminal. po prostu wpisz: apt-get install clang i clang jest gotowy do kompilacji i znajduje stdio.h bez narzekania.

Ale jeśli zamierzasz uruchomić wynikowy plik wykonywalny nie na mobaxterm/cygwin, ale w samych oknach, musisz zamiast tego skompilować z mingwin.