Hvordan krydser jeg C-kode på Windows til en binær til også at køre på Unix (Solaris/HPUX/Linux)?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har kigget på Cygwin/Mingw/lcc, og jeg kunne godt lide at kunne kompilere perl-native C-udvidelser på mine vinduer (helst under cygwin) og derefter køre dem på Solaris og HP unix uden yderligere problemer, er det muligt?]] [4] [5]


Alt dette stammer fra mit oprindelige perl cross platform spørgsmål her.

Bedste reference


Cross-compiler er meget svært at installere og fungerer korrekt.


Overvej at (netværket hos) NetBSD skal lægge en stor del af arbejdet for at krydskompilere til arbejde, og de kører det samme OS, bare forskellige arkitekturer.


Du skal i det mindste kopiere alle overskrifterne fra de andre operativsystemer til Windows og få en kryds-compiler, linker osv. Til mål-OS/arkitekturen.


Det kan også godtvis ikke være muligt - perl og delte biblioteker kan kompileres med en indbygger/ikke-gcc compiler, som ikke vil være tilgængelig på Windows overhovedet.

Andre referencer 1


(Dette er et meget gammelt spørgsmål, men mangler nogle nyttige oplysninger -
Jeg har personligt gjort dette til Solaris (SPARC &x86), AIX, HP-UX og Linux (x86, x64).)



  • At få C + + krydskompileret er meget sværere end lige C.

  • HP-UX 32-bit PA-RISC understøttes ikke, fordi den bruger SOM-format i stedet for ELF, og binutils understøtter ikke (og sandsynligvis vundet 't nogensinde) SOM. Med andre ord kan du kun krydstille 64-bit PA-RISC. (Kræver PA-RISC 2.0 chip.)

  • Jeg ville gå med mingw i stedet for cygwin, hvis du kan. Cygwin introducerer mange filtilladelse hovedpine og cygwin1.dll afhængigheder, der kan være besværlige. Hvis det er muligt, skal du dog bygge videre på linux. Alt vil være meget hurtigere, fordi alle de værktøjer og scripts du kører er designet til et miljø, hvor exec og stat er hurtige operationer. Windows + NTFS er ikke det samme miljø.

  • Start med crosstools scriptet, men vær forberedt på at bruge meget tid på dette.

  • Prøv med de nyeste gcc/binutuils først, men hvis du ikke kan overvinde problemer, prøv at droppe tilbage til ældre pakker. Fx for Power3 (AIX) gcc 4.x serie kryds compiler genererer dårlig kode, 3.x er fint .

  • Når du kopierer indbyggede libs og overskrifter, skal du sørge for, at du kopierer fra den ældste maskine, du sandsynligvis vil køre. Kopiering af en ny libc betyder, at din kode ikke vil køre på nogen maskine med en ældre libc.

  • Når du kopierer indfødte libs og overskrifter, vil du sandsynligvis have 'tjære -h' til at skifte symlinks til faktiske filer. Se også på, at på Solaris er nogle nødvendige CRT-objektfiler begravet i en cc-mappe, ikke under/usr/lib


Andre referencer 2


Jeg er enig med Douglas, at få en kryds compiler op og arbejde er meget svært at gøre. Dette er generelt dit valg af sidste udvej. Hvis du er bootstramning eller gør en binær til en integreret enhed, så er krydskompilering ofte din eneste mulighed. Du bør være sikker på at kompilere din egen gcc under Cygwin, før du overvejer at krydse kompilering. For at krydse kompilere skal du opbygge en gcc til at køre under vinduer, men som vil oprette binære filer til din udførelsesplatform. Prøveinstrukser til at gøre dette findes her. [8]


Måske vil du krydse kompilere, fordi du ikke har rod og/eller ikke kan kompilere på din målplatform. For eksempel havde jeg en hosting provider, der løb Redhat Linux. Jeg kunne køre Perl CGI scripts og tilhørende moduler, men jeg kunne ikke kompilere på målmaskinen, og en biblioteker jeg byggede skulle eksistere i min egen mappe.


For at løse dette kunne jeg have forsøgt at krydse kompilere til min målplatform, men i stedet besluttede jeg at opsætte en lignende vært inde i en VM på Windows. Fra Cygwin kan du oprette et script, som ssh er i din VM, kopierer din kilde og gør en fuld konfiguration/build. Det sidste skridt var at indsætte den binære artefakt på mit hostede system.


Jeg har succesfuldt haft både Solaris 10 og Open Solaris kører inden for en VM på Windows. Desværre har du måske en sværere tid at køre HPUX under en VM.

Andre referencer 3


Hvorfor har du ikke læst på 'Grand Unified Builder' (http://lilypond.org/gub/og http://valentin.villenave.info/The-LilyPond-Report-11 (sektion # 4)) [9] [10]


Jeg ved ikke hvordan det virker, men GUB gør det muligt for Lilypond-udviklerne at kompilere for omkring 11 platforme på en linux-boks.

Andre referencer 4


Kompilér på Windows, og brug derefter Vin til at køre dem på nogen * nix. Det fungerer godt det meste af tiden.

Andre referencer 5


Nej, det er ikke muligt på binært niveau. Der er så mange forskelle på binært niveau mellem de forskellige OS'er og CPU'er.


Men hvad du kan gøre er at gøre din C-udvidelsekilde kompatibel, så den kan kompilere til forskellige platforme. C blev designet som et 'bærbart samlingssprog'. Så længe du holder fast i rutiner, der er cross-platform, så vil de normalt arbejde det samme. Du skal stadig teste, fordi der kan være fejl, der findes på en bestemt platform.

Andre referencer 6


Dette kan ikke gøres ... men er det så meget besvær at genkompilere koden under Solaris eller HP?