2010-09-03 6 views
8

Ich möchte eine Standalone-Exe mit Cygwin machen. Ich habe zwei Möglichkeiten:Kompilieren stand alone exe mit Cygwin

  1. staticly Link cygwin1.dll
    Wenn ich statisch cygwin1.dll verknüpfen kann, dann kann ich eine eigenständige exe bekommen.

  2. Merge cygwin1.dll mit myprog.exe
    Wenn ich cygwin1.dll mit meinem Programm zusammenführen kann, die ich eine eigenständige exe bekommen kann.

Nicht vorschlagen, dass ich IlMerge verwende. Dies wird nicht funktionieren, da ich mein Programm nicht mit .NET kompiliert habe.

Sind diese Optionen möglich? Wenn nicht, ist mit diesem Dilemma etwas möglich? Danke!

+0

Ich nehme an, dass Sie tatsächlich Dienste von CYGWIN.DLL benötigen, und nur die Verwendung von -Mno-Cygwin (oder MinGW) wird nicht für Sie arbeiten? – RBerteig

+0

Ich weiß es nicht. Ich benutze GCJ, aber ich konnte den GCJ, der mit Mingw geliefert wurde, nicht zur Arbeit bringen. –

Antwort

3

Ich kann zwei Möglichkeiten sehen, die Sie für angemessen halten könnten. Eine wäre, eine Stub-ausführbare Datei mit einem anderen Compiler zu erstellen (z. B. MinGW - was auch immer, nur um cygwin nicht zu benötigen), um die Haupt-ausführbare Datei und cygwin.dll in ein temporäres Verzeichnis zu entpacken und dann diese ausführbare Datei zu erzeugen. Um nur eine einzelne ausführbare Datei zu verteilen, sollten Sie die Haupt-ausführbare Datei und cygwin.dll als binäre Ressourcen zum "Stub" hinzufügen. Es ist ein bisschen hässlich, aber ziemlich einfach.

Die Alternative wäre, die source to cygwin zu greifen und es als eine statische Bibliothek aufzubauen. Zumindest in der Theorie sollte das sauberer sein - aber es ist zweifellos auch mehr Arbeit. Es wird mit ziemlicher Sicherheit etwas Arbeit bringen, es als reinen statischen Code anstelle einer DLL zu erstellen, obwohl man sich kaum vorstellen kann, wie viel. Wenn man nur ein bisschen surft, ist es ziemlich unwahrscheinlich, dass es ein schneller Job von ein paar Stunden oder so etwas sein wird (es sei denn, es gibt etwas, das ich vermisst habe, das unterstützt es natürlich, es statisch zu bauen).

3

Versuchen Sie, -mno-cygwin als Compiler und Linker-Flag übergeben. Wenn die Anforderungen Ihres Programms einfach genug sind, vermeiden Sie, abhängig von Cygwin-Bibliotheken, eine eigenständige EXE zu erstellen.

+1

Andere Beiträge haben angezeigt, dass dies nicht mehr funktioniert, um neueren Lesern zu helfen. Die Funktion ist jetzt veraltet. – eewanco

1

Präzisere Antwort von Jerry.

Das unten beschriebene Verfahren sollte mit Ihrem Recht und Lizenzrecht konfrontiert werden! Ich weiß, dass es funktionieren kann, aber die Rechte, das Ergebnis zu verteilen (oder sogar das Verfahren durchzuführen), können (und ich fühle mich wirklich so) von einer Cygwin-Lizenz begrenzt werden. Das liegt daran, dass die Anwendung noch auf Cygwin beziehen (auch wenn es sinnlos ist - ist aber immer noch in der App)

Angenommen hello.exe ist der Name der großen Anwendung unter Cygwin in großen Projektverzeichnis zusammengestellt C:\xxx\yyy\zzz\

In gehen die cygwin-Konsole C:\xxx\yyy\zzz und geben

objdump -p hello.exe | grep "DLL Name" 

Sie erhalten alle DLLs Ihre Anwendung verwendet. Kopieren Sie dann C:\xxx\yyy\zzz in alle für cygwin aufgelisteten DLLs.

Beachten Sie, dass Ihre Anwendung andere Anwendungen aufrufen kann (z. B. mit der exec-Funktion) --- Bibliotheken finden Anwendungen und kopieren Sie diese Bibliotheken sowie diese Anwendungen selbst - zu C:\xxx\yyy\zzz.

Vielleicht müssen Sie Ihr Projekt mit Option der Art -L C:\xxx\yyy\zzz oder so neu kompilieren.Beobachte alle anderen Pfade in deinen Quellen.

So wird Ihre Anwendung unabhängig von Cygwin-Installation und Sie können ihre Funktionalität zu präsentieren/teilen Sie es mit ---- anderen Windows-Benutzern ohne Cygwin. Aber - noch einmal, ich weise darauf hin und frage dich - sei dir der richtigen Lizenz und dem Gesetz der Cygwin-Schöpfer bewusst und beobachte sie!