2010-09-03 4 views
8

Je veux faire un exe autonome avec cygwin. J'ai deux options:Compile stand alone exe avec Cygwin

  1. lien staticly cygwin1.dll
    Si je peux lier statiquement cygwin1.dll, je peux obtenir un exe autonome.

  2. Fusion cygwin1.dll avec monprog.exe
    Si je peux fusionner cygwin1.dll avec mon programme, je peux l'obtenir un exe autonome.

Ne suggérez pas que j'utilise IlMerge. Cela ne fonctionnera pas car je n'ai pas compilé mon programme avec .NET.

Certaines de ces options sont-elles possibles? Sinon, y a-t-il quelque chose de possible avec ce dilemme? Merci!

+0

Je suppose que vous avez réellement besoin des services de CYGWIN.DLL, et juste utiliser -Mno-cygwin (ou MinGW) ne fonctionnera pas pour vous? – RBerteig

+0

Je ne sais pas. J'utilise GCJ, mais je n'ai pas pu obtenir le GCJ fourni avec mingw. –

Répondre

3

Je peux voir deux possibilités que vous pourriez considérer raisonnables. Un serait de construire un exécutable stub avec un compilateur différent (par exemple, MinGW - quoi qu'il en soit, juste pour ne pas avoir besoin de cygwin) pour décompresser l'exécutable principal et cygwin.dll dans un répertoire temporaire, puis générer cet exécutable. Pour distribuer un seul exécutable, vous devez ajouter l'exécutable principal et le fichier cygwin.dll au "stub" en tant que ressources binaires. C'est un peu moche, mais assez simple. L'alternative serait de saisir le source to cygwin et de le construire comme une bibliothèque statique. Au moins en théorie, cela devrait être plus propre - mais c'est aussi sans aucun doute plus de travail. L'obtenir pour construire en tant que code purement statique au lieu d'une DLL va presque certainement prendre un peu de travail, même s'il est difficile de deviner combien. Juste un peu de navigation, il semble assez improbable que ce soit un travail rapide de quelques heures, ou quelque chose comme ça (à moins qu'il y ait quelque chose que j'ai raté qui supporte déjà de le construire de façon statique, bien sûr).

3

Essayez de passer -mno-cygwin comme indicateur de compilation et d'éditeur de liens. Si les exigences de votre programme sont assez simples, cela évitera de dépendre des bibliothèques Cygwin et de créer un EXE autonome.

+1

D'autres messages ont indiqué que cela ne marche plus, pour le plaisir des lecteurs plus récents. La fonctionnalité est maintenant obsolète. – eewanco

1

Réponse plus précise de Jerry.

La procédure décrite ci-dessous devrait être confrontée à vos droits et à la loi de licence! Je sais que cela peut fonctionner mais les droits de distribuer le résultat (ou même d'effectuer la procédure) peuvent être (et je le sens vraiment) limités par la licence Cygwin. C'est parce que votre demande sera toujours se référer à Cygwin (même si elle ne sert à rien - mais est toujours dans votre application)

Supposons hello.exe est le nom de votre grande application compilée sous Cygwin dans le répertoire grand projet C:\xxx\yyy\zzz\

En la console Cygwin aller à C:\xxx\yyy\zzz et le type

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

Vous obtenez toutes les DLL utilisées par votre application. Puis copiez C:\xxx\yyy\zzz à toutes les DLLs répertoriées et spécifiques à Cygwin.

Notez que votre application peut invoquer d'autres applications (en utilisant la fonction exec par exemple) --- trouver des bibliothèques utilise des applications et copier ces bibliothèques ainsi que ces applications elles-mêmes - à C:\xxx\yyy\zzz.

Peut-être que vous devrez recompiler votre projet avec l'option de type -L C:\xxx\yyy\zzz ou plus.Regardez tous les autres chemins dans vos sources.

Ainsi, votre application devient indépendante de l'installation de Cygwin et vous pouvez présenter ses fonctionnalités à/partager avec ---- d'autres utilisateurs de Windows sans Cygwin. Mais - une fois de plus je vous demande et je vous demande - soyez au courant de la licence et de la loi des créateurs de Cygwin et observez-les!