Ne peut pas compiler simple application C # avec mkbundle
Question
J'ai écrit une console « Bonjour tout le monde » app -comme. et ont suivi c # cywgwin fenêtres mono mkbundle 7 - ne peut pas la réponse de fichier de compilation. Mais j'ai:
$ mkbundle -o Fur Furries.exe --deps -z
OS is: Windows
Sources: 1 Auto-dependencies: True
embedding: C:\Monotest\Furries.exe
compression ratio: 40.43%
embedding: C:\Soft\Mono\lib\mono\4.0\mscorlib.dll
compression ratio: 34.68%
Compiling:
as -o temp.o temp.s
gcc -mno-cygwin -g -o Fur -Wall temp.c `pkg-config --cflags --libs mono-2|dos2un
ix` -lz temp.o
temp.c: In function `main':
temp.c:173: warning: implicit declaration of function `g_utf16_to_utf8'
temp.c:173: warning: assignment makes pointer from integer without a cast
temp.c:188: warning: assignment makes pointer from integer without a cast
/tmp/ccQwnxrF.o: In function `main':
/cygdrive/c/Monotest/temp.c:173: undefined reference to `_g_utf16_to_utf8'
/cygdrive/c/Monotest/temp.c:188: undefined reference to `_g_utf16_to_utf8'
collect2: ld returned 1 exit status
[Fail]
Il est sous Windows XP.
La solution
Tout d'abord, préparer l'environnement de développement:
- Installer Mono. Par exemple, vous avez installé dans «
C:\Soft\Mono
». - Installer Cygwin. Lors de la sélection des paquetages à installer select suivante:. Gcc-MinGW, MinGW-zlib, pkg-config, nano
- Démarrer le shell Cygwin Bash (soit en utilisant un lien ou commande "
bash --login -i
"). - Ouvrir "
$HOME/.bashrc
" avec "nano" ( "nano ~/.bashrc
"). Ne pas utiliser les éditeurs qui ne conserve pas de fin de ligne s ( « CR », « LF », « CR / LF » ou autre), ou corrompre le fichier! -
Ajoutez les lignes suivantes à la fin du fichier:
export PKG_CONFIG_PATH=/cygdrive/c/Soft/Mono/lib/pkgconfig export PATH=$PATH:/cygdrive/c/Soft/Mono/bin
-
Restart Cygwin shell bash.
Après cela, vous pouvez compiler vos ensembles avec "mkbundle":
- Effectuer la commande suivante: "
mkbundle -c -o host.c -oo bundle.o --deps YourAssembly.exe <additional arguments>
". Vous pouvez passer en option également «-z
» pour comprimer ensemble résultant. Vous devriez obtenir "host.c" et les fichiers "bundle.o". -
Dans "host.c", vous devez supprimer "_WIN32" "branche" (sauf "une
#include <windows.h>
"). Il ne fonctionne pas. Vous pouvez le faire en ajoutant simplement «#undef _WIN32
» juste après les lignes suivantes dans ce:#ifdef _WIN32 #include <windows.h> #endif
Vous obtiendrez:
#ifdef _WIN32 #include <windows.h> #endif #undef _WIN32
-
Exécutez la commande suivante: "
gcc -mno-cygwin -o ResultantBundle.exe -Wall host.c
`pkg-config --cflags --libs mono-2|dos2unix`
bundle.o <additional arguments>
". Si vous avez ajouté un argument supplémentaire -Z à l'étape 2, vous devez ajouter un argument supplémentaire -lz dans cette étape. - Vous obtiendrez "ResultantBundle.exe". Ceci est votre application Mono emballé comme exécutable autonome.
- Il faut encore « mono-2.0.dll » et une DLL-s et des ressources supplémentaires que vous dépendait au cours du développement (par exemple, il peut exiger GTK # DLL s native) mais il n'a pas besoin de temps d'exécution complète Mono run.
Autres conseils
Je voulais juste ajouter que si vous passez à -Z mkbundle alors vous aurez besoin de passer -lz à gcc. J'ai eu quelques problèmes pour trouver une application avec WinForms et l'accès au réseau pour fonctionner correctement, et je devais copier machine.config de C: \ Mono \ etc \ mono \ 4.0 \ machine.config à l'endroit où ma demande était. Je me suis alors passé --machine-config machine.config à mkbundle.
Toutes ces étapes sont assez confus et frustrant, pourquoi n'est pas aussi simple que taper mkbundle --deps app.exe? J'ai essayé de faire un changement au modèle utilisé par mkbundle et la compilation moi-même, mais il ne sera pas exécuté. Je suis allé jusqu'à maintenant télécharger la source mono et tentent de construire la chose, mais je doute que cela fonctionnera. Si quelqu'un peut expliquer ce que l'enfer va avec mkbundle pour faire de ce si ennuyeux, je serais intéressé à contribuer.
Une fois que vous avez la temp.o et temp.c, vous pouvez les ajouter à c ++ visuel pour faire une application Windows avec d'autres sources.