Forum: Compiler & IDEs Kompiler unter Linux soll eine *.exe für Windows erzeugen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Esmu P. (Firma: privat) (max707)


Lesenswert?

Kurz und knapp:

Ich habe in einer virtuellen Maschine Linux installiert.
Damit habe ich ein Programm kompiliert was unter Linux funktioniert.

Frage: kann ich mit dem Kompiler unter Linux auch eine *.exe Datei 
erzeugen die auch unter Windows10 funktioniert?

Warum? Weil die Kompilierung unter Windows 10 nicht funktioniert.

Hat hier jemand gute Ideen zur Lösung und kann sie hier für die User 
hier posten?

von G. K. (zumsel)


Lesenswert?

Vielleicht Cygwin?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Dafür gibt's spezielle Cross-Compiler wie i686-w64-mingw32-gcc.

von C-hater (c-hater)


Lesenswert?

Esmu P. schrieb:

> Ich habe in einer virtuellen Maschine Linux installiert.
> Damit habe ich ein Programm kompiliert was unter Linux funktioniert.
>
> Frage: kann ich mit dem Kompiler unter Linux auch eine *.exe Datei
> erzeugen die auch unter Windows10 funktioniert?

Im Prinzip ist das kein großes Problem. So lange das Programm keine 
Abhängigkeiten hat, für die es kein passendes Äquivalent unter Windows 
gibt.

> Warum? Weil die Kompilierung unter Windows 10 nicht funktioniert.

Nunja, das kann viele Ursachen haben. Eine davon wäre natürlich: 
fehlende Abhängigkeiten. Dann ist natürlich genauso Ende Gelände, als 
wenn du das Zeug unter Linux kompilierst.
Aber es gibt noch mehr Fehlermöglichkeiten, die unter dieser Schwelle 
bleiben und dementsprechend möglicherweise behebbar wären...

Die Chance, den Kram zum Kompilieren zu bringen, ist also (etwas) höher, 
wenn du das unter Windows versuchst.

von Stefan F. (Gast)


Lesenswert?

Esmu P. schrieb:
> kann ich mit dem Kompiler unter Linux auch eine *.exe Datei
> erzeugen die auch unter Windows10 funktioniert?

Mit dem Compiler geht das wohl nicht, aber mit dem anderen.

Bitte, gerne geschehen.

von Motopick (motopick)


Lesenswert?

Crosscompilieren ist ein urrrralter Hut.
Schon MS-C V6 konnte unter SCO-UNIX ein EXE-File erzeugen.
Auf Wunsch auch ein COM-File, wenn es denn hineinpasste.
Und das ist nun wirklich schon droellfzik Jahre her.

von Rolf M. (rmagnus)


Lesenswert?

Ja, mingw sollte die einfachste Lösung sein. Damit cross-compiliere ich 
aus Windows-Programme von Linux aus. Wenn du aber viele 
Bibliotheksabhängigkeiten hast, musst du die auch alle bauen. Oder du 
verwendest mxe. Das dauert zwar etwas, weil es selbst den ganzen 
Cross-Compiler und die ganzen Libs baut, aber hat bei mir immer 
hervorragend funktionert. Siehe https://mxe.cc/

Mit clang kann man direkt auch native Windows-Programme erstellen, weil 
bei dem alle Zielplattformen in einem Compiler eingebaut sind, 
allerdings braucht man die ganzen Visual-C++-Bibliotheken und Header, 
weil die bei clang nicht dabei sind.

von Malte _. (malte) Benutzerseite


Lesenswert?

Unter Debian:

1. sudo apt install apt install gcc-mingw-w64-i686-win32
2. echo "int main(void) { printf(\"Hello World\\n\");}" > hello.c
3. i686-w64-mingw32-gcc hello.c -o hello.exe
4. wine hello.exe

Hello World

:)

Eventuell musst du unter Windows dann noch nach ein paar notwendigen 
DLLs Ausschau halten.

von G. K. (zumsel)


Lesenswert?

Motopick schrieb:
> Crosscompilieren ist ein urrrralter Hut.
> Schon MS-C V6 konnte unter SCO-UNIX ein EXE-File erzeugen.
> Auf Wunsch auch ein COM-File, wenn es denn hineinpasste.
> Und das ist nun wirklich schon droellfzik Jahre her.

Dafür hat dieser Dreck bei normalen Unix-Sourcen ziemlich verkackt.

von Harald K. (kirnbichler)


Lesenswert?

Esmu P. schrieb:
> Warum? Weil die Kompilierung unter Windows 10 nicht funktioniert.

[ ] Der Compiler gibt ohne Ausgabe einer Fehlermeldung auf

[ ] Windows 10 enthält gar keinen Compiler

[ ] Der Compiler lässt sich unter Windows 10 nicht aufrufen, es 
erscheint die Fehlermeldung, daß 16-Bit-Code nicht ausgeführt werden 
kann

[ ] Der Compiler gibt diverse Fehlermeldungena aus, Du hast aber keine 
Lust, sie Dir anzusehen

[ ] Du machst irgendwas anderes falsch

von Esmu P. (Firma: privat) (max707)


Lesenswert?

Es ist jetzt nicht mehr nötig, da ich die Kompilierung unter Windows hin 
bekommen habe. :-)

Habe das Makefile passend editiert.

von Esmu P. (Firma: privat) (max707)


Lesenswert?

Malte _. schrieb:
> Unter Debian:
>
> 1. sudo apt install apt install gcc-mingw-w64-i686-win32
> 2. echo "int main(void) { printf(\"Hello World\\n\");}" > hello.c
> 3. i686-w64-mingw32-gcc hello.c -o hello.exe
> 4. wine hello.exe
>
> Hello World
>
> :)
>
> Eventuell musst du unter Windows dann noch nach ein paar notwendigen
> DLLs Ausschau halten.

Was ist Wein? Ich benutze es nicht. Im letzten Jahrtausend ein paar Male 
verwendet.

von Esmu P. (Firma: privat) (max707)


Lesenswert?

Johann L. schrieb:
> Dafür gibt's spezielle Cross-Compiler wie i686-w64-mingw32-gcc.

Danke für den Tip!

Den unter Linux, hier ein Mint-System, installieren reicht aus? Oder muß
man dann wieder herum frickeln?

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Esmu P. schrieb:
> Den unter Linux, hier ein Mint-System, installieren reicht aus? Oder muß
> man dann wieder herum frickeln?

Keiner von uns weiß, welche Bibliotheken Du verwenden willst... Und 
eigentlich interessiert es auch keinen.

von Stefan F. (Gast)


Lesenswert?

Esmu P. schrieb:
> Was ist Wein? Ich benutze es nicht. Im letzten Jahrtausend ein paar Male
> verwendet.

Wine, nicht Wein. Und wenn du es ein paar mal verwendet hast, dann 
weisst du auch, was es ist.

von Stefan F. (Gast)


Lesenswert?

Andreas S. schrieb:
> Keiner von uns weiß, welche Bibliotheken Du verwenden willst.

Wir wissen noch nicht mal, ob es ein C Programm ist, was er compilieren 
will. Sein verspäteter Hinweis auf das Makefile legt es nahe, muss aber 
nicht zwingend sein.

von Esmu P. (Firma: privat) (max707)


Lesenswert?

In erster Annäherung ist es völlig egal!

Aber:

Ich hatte die Quelldateien, die nicht von mir stammen, die in c und c++ 
geschrieben waren, mittels gcc auf einem Linux-Mint System compiliert 
und  auf dem Mint Rechner super funktionieren.

Jetzt will ich auf dem Mint PC das Programm so kompilieren das es auf 
einem Windows PC auch läuft.

von Esmu P. (Firma: privat) (max707)


Lesenswert?

Andreas S. schrieb:
> Esmu P. schrieb:
>> Den unter Linux, hier ein Mint-System, installieren reicht aus? Oder muß
>> man dann wieder herum frickeln?
>
> Keiner von uns weiß, welche Bibliotheken Du verwenden willst... Und
> eigentlich interessiert es auch keinen.

Ja, wenn ich das nur selber wüßte?

Geht jetzt aber auch am Thema vorbei, es geht mir um ein prinzipielles 
vorgehen.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Esmu P. schrieb:
> Ja, wenn ich das nur selber wüßte?
Tja...Das beste Klavier nuetzt nichts, wenn man nicht drauf spielen 
kann.

> Geht jetzt aber auch am Thema vorbei, es geht mir um ein prinzipielles
> vorgehen.
Nee, prinzipiell ist das ein grosser Unterschied, ob ich per 
Crosscompiler sowas wie ein helloworld fuer eine andere Platform bauen 
will, was "nur" eine libc braucht oder sowas wie z.b. ffmpeg, was je 
nach config alle moeglichen, teilweise recht "exquisiten" libraries 
brauchen kann.
Mein persoenlicher Eindruck ist dann auch noch: Je "moderner", d.h. 
weiter weg von Make und Autotools das Buildsystem ist, desto 
unangenehmer wird's mit dem crosscompilieren.

Gruss
WK

von Esmu P. (Firma: privat) (max707)


Lesenswert?

Volle Zustimmung, mein in Mint installiertes gcc ist normal mit dem 
Paketmanager installiert worden, ohne noch zusätzliche Pakete etc. Also 
Standard Version. Nix gefrickeltes.

Das sollte doch irgendwie gehen. Ok, diese eine Antwort mit dem 
Cross-compiler 
Beitrag "Re: Kompiler unter Linux soll eine *.exe für Windows erzeugen"
zeigt schon einmal die grobe Richtung vor. Habe ich aber noch nie 
gemacht, daher meine Eingangsfrage.

: Bearbeitet durch User
von Motopick (motopick)


Lesenswert?

G. K. schrieb:

> Dafür hat dieser Dreck bei normalen Unix-Sourcen ziemlich verkackt.

Moegliche Alternativen waren aber auch seeehr duenn gesaet.
Der GCC war zu der Zeit noch bei Version 1.xyz. :)
Und die Moeglichkeit auch "cross" zu kompilieren dankend
entgegengenommen.

Als ich ein Vektorzeichenprogramm gebraucht habe, liess sich "TGIF"
aus den Quellen problemlos uebersetzen. Sogar mit meinen Aenderungen,
die aus den Zollskalen Centimeterskalen gemacht haben.
Aber netuerlich unter "X". :)

Mitunter lag es vielleicht auch an den "akrobatischen Turnuebungen"
> bei normalen Unix-Sourcen

von Stefan F. (Gast)


Lesenswert?

Ich bin früher auf https://www.cygwin.com/ gekommen. Die Grundidee von 
CygWin ist, sämtliche Standardprogramme von Linux (nicht nicht den 
Kernel) für Windows zu Cross-Compilieren.

Ich brauchte es, um ein recht komplexes Shell Script unter Windows 
laufen zu lassen. Später habe ich das auch mal genutzt, um ein selbst 
entwickeltes C Programm sowohl für Linux als auch Windows bereit zu 
stellen.

Wenn du ein C Programm mit dem gcc von CygWin zu einer *.exe 
compilierst, kannst du zahlreiche Bibliotheken und System-Calls aus der 
Linux Welt nutzen. Die cygwin.dll enthält den dazu nötigen 
Kompatibilitäts-Layer.

CygWin geht also noch einen Schritt weiter, als ein einfacher 
Cross-Compiler. Sehr viele Linux Programme lassen sich damit ohne 
Anpassung unter Windows Nutzen - selbst wenn sie Linux Spezifische 
System-Calls enthalten.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Esmu P. schrieb:
> Andreas S. schrieb:
>> Keiner von uns weiß, welche Bibliotheken Du verwenden willst... Und
>> eigentlich interessiert es auch keinen.
> Geht jetzt aber auch am Thema vorbei, es geht mir um ein prinzipielles
> vorgehen.

Nein, es geht (neben den Einstellungen für die Zielplattform) exat um 
dieses Thema und wenig anderes. Aber auf Grund Deiner völlig 
nichtsagenden Fehlerbeschreibungen läuft es wohl fast auf dasselbe 
hinaus, welche Art von Fehler auftritt.

Suche Dir lieber ein anderes Hobby, z.B. Kieselsteine sammeln.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Stefan F. schrieb:
> Ich bin früher auf https://www.cygwin.com/ gekommen. Die Grundidee von
> CygWin ist, sämtliche Standardprogramme von Linux (nicht nicht den
> Kernel) für Windows zu Cross-Compilieren.

Jein. Die Grundidee besteht darin, eine POSIX- bzw. UNIX-artige Umgebung 
zu schaffen. Und hierfür bedient sich Cygwin unter anderem(!) der sehr 
gebräuchlichen GNU-Werkzeuge. Diese wurden ursprünglich aber als 
Grundlage für GNU Hurd entwickelt, aber dann auch für Linux "geklaut". 
Korrekterweise spricht man bei heutigen Systemen daher auch nicht von 
Linux, sondern von GNU/Linux.

von Rolf M. (rmagnus)


Lesenswert?

Andreas S. schrieb:
> Jein. Die Grundidee besteht darin, eine POSIX- bzw. UNIX-artige Umgebung
> zu schaffen. Und hierfür bedient sich Cygwin unter anderem(!) der sehr
> gebräuchlichen GNU-Werkzeuge. Diese wurden ursprünglich aber als
> Grundlage für GNU Hurd entwickelt, aber dann auch für Linux "geklaut".

Sie wurden für GNU entwickelt. Hurd war ein Kernel, der ebenfalls für 
GNU entwickelt wurde. GNU sollte das neue Betriebssystem von Richard 
Stallman werden als Nachbau von Unix. Dann kam Torvalds mit seinem 
Linux-Kernel, und der wurde dann meistens statt Hurd verwendet, weil er 
schneller voran kam. Zum Ärger von Stallman wurde dann "Linux" als 
Bezeichnung für das ganze System üblich.

> Korrekterweise spricht man bei heutigen Systemen daher auch nicht von
> Linux, sondern von GNU/Linux.

Das ist nicht korrekt, denn viele Komponenten sind nicht Teil von GNU, 
wie z.B. Xorg, der designierte Nachfolger Wayland, KDE, Systemd und 
Tausende weiterer Tools. Die müssten dann also auch extra genannt 
werden, und wo hört man da dann auf? Von daher ist "GNU/Linux" 
eigentlich genauso falsch wie nur "Linux".

von Esmu P. (Firma: privat) (max707)


Lesenswert?

Stefan F. schrieb:
> Ich bin früher auf https://www.cygwin.com/ gekommen. Die Grundidee
> von
> CygWin ist, sämtliche Standardprogramme von Linux (nicht nicht den
> Kernel) für Windows zu Cross-Compilieren.
>

> Ich brauchte es, um ein recht komplexes Shell Script unter Windows
> laufen zu lassen. Später habe ich das auch mal genutzt, um ein selbst
> entwickeltes C Programm sowohl für Linux als auch Windows bereit zu
> stellen.
>

> Wenn du ein C Programm mit dem gcc von CygWin zu einer *.exe
> compilierst, kannst du zahlreiche Bibliotheken und System-Calls aus der
> Linux Welt nutzen. Die cygwin.dll enthält den dazu nötigen
> Kompatibilitäts-Layer.
>

> CygWin geht also noch einen Schritt weiter, als ein einfacher
> Cross-Compiler. Sehr viele Linux Programme lassen sich damit ohne
> Anpassung unter Windows Nutzen - selbst wenn sie Linux Spezifische
> System-Calls enthalten.

Danke, momentan besteht ja kein Handlungsbedarf. Ich melde mich wie der 
wenn es akut wird. :-)

von Rbx (rcx)


Lesenswert?

Früher konne man mit Cygwin mit einem Schalter beim Kompilieren einfache 
Windowsprogramme, vor allem kleine Konsolenprogramme erstellen.
Es hieß dann, das der Übersetzer Windows-Ressourcen einbezieht.
Davon ist man aber weg - möglichereise auch wegen verschiedener 
Windowsversionen und -Bibliotheken da.
Aktuell müsste man bei Cygwin erstmal nachlesen, was aktuell geht, und 
was nicht.
https://www.cygwin.com/cygwin-ug-net/using-effectively.html

Es hängt bei dem Windowsprogramm auch sehr davon ab, wie kompatibel es 
ist. Es gibt Windowsprogramme, die laufen auf jedem Windows, bzw. 
sollten das tun - und andere, die laufen nur mit einem bestimmten 
Windows oder mit einer bestimmten Entwicklungsstufe.

Aktuell würde ich mal versuchen, wie weit man mit Wine kommt, Programme 
wie IDA oder Notepad laufen da ja auch ganz gut.

Dann mal schauen, wie gut man den OpenWatcom-Compiler unter Wine zum 
laufen bekommt.

https://wiki.archlinux.org/title/Open_Watcom

von Harald K. (kirnbichler)


Lesenswert?

Rbx schrieb:
> Dann mal schauen, wie gut man den OpenWatcom-Compiler unter Wine zum
> laufen bekommt.

Sinnvoller dürfte es sein, llvm/clang zu verwenden und dem die 
maschinenspezifischen Libraries/Header/etc. unterzujubeln.

Die kann man beispielsweise einer Windows-Installation von llvm/clang 
entnehmen.

Und man kann damit auch den Gegenweg gehen, unter Windows nativ 
ausführbare *nix-Binaries erzeugen.

Vorteil: Moderner Compiler, kein Emulationsgekrampfe mit Wine o.ä.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.