7

I have written some console "Hello world"-like app. and have followed c# cywgwin mono mkbundle windows 7 - cannot compile file answer. But I have got:

$ 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]

It's in Windows XP.

Community
  • 1
  • 1
Lavir the Whiolet
  • 1,006
  • 9
  • 18

3 Answers3

13

First of all, prepare development environment:

  1. Install Mono. For example, you have installed it into "C:\Soft\Mono".
  2. Install Cygwin. When selecting which packages to install select following: gcc-mingw, mingw-zlib, pkg-config, nano.
  3. Start Cygwin Bash shell (either using a link or "bash --login -i" command).
  4. Open "$HOME/.bashrc" with "nano" ("nano ~/.bashrc"). Don't use editors which don't preserve end-of-line-s ("CR", "LF", "CR/LF" or other), or it will corrupt the file!
  5. Add following lines to the end of the file:

    export PKG_CONFIG_PATH=/cygdrive/c/Soft/Mono/lib/pkgconfig
    export PATH=$PATH:/cygdrive/c/Soft/Mono/bin
    
  6. Restart Cygwin Bash shell.

After that you can compile your assemblies with "mkbundle":

  1. Perform the following command: "mkbundle -c -o host.c -oo bundle.o --deps YourAssembly.exe <additional arguments>". You also may optionally pass "-z" to compress resultant bundle. You should get "host.c" and "bundle.o" files.
  2. In "host.c" you should remove "_WIN32" "branch" (except "#include <windows.h>" one). It doesn't work. You may do it just by adding "#undef _WIN32" right after following lines in it:

    #ifdef _WIN32
    #include <windows.h>
    #endif
    

    So you'll get:

    #ifdef _WIN32
    #include <windows.h>
    #endif
    #undef _WIN32
    
  3. Perform the following command: "gcc -mno-cygwin -o ResultantBundle.exe -Wall host.c `pkg-config --cflags --libs mono-2|dos2unix` bundle.o <additional arguments>". If you added a -z additional argument in step 2, you must add a -lz additional argument in this step.

  4. You will get "ResultantBundle.exe". This is your Mono application packed as standalone executable.
  5. It still requires "mono-2.0.dll" and some additional DLL-s and resources you depended on during development (for example, it may require GTK# native DLL-s) but it doesn't require full Mono runtime to run.
Ben
  • 1,272
  • 13
  • 28
Lavir the Whiolet
  • 1,006
  • 9
  • 18
  • Couldn't you pass "--static" to include the mono dll? This would trigger the LGPL stuff, but if the askers application is already open source, this is usually not a big deal. – Sqeaky Oct 09 '13 at 03:31
  • Sqeaky, that is a good suggestion but I don't have enough time to test it. Can you check it? – Lavir the Whiolet Oct 10 '13 at 16:23
  • I will but not in the next day or two. I am working on creating SWIG binding s for a library. We want C# bindings, among others, once I do that I will post findings here. – Sqeaky Oct 11 '13 at 18:18
1

Just wanted to add that if you pass -z to mkbundle then you'll need to pass -lz to gcc. I had some issues getting an application with winforms and net access to work properly, and I had to copy machine.config from C:\Mono\etc\mono\4.0\machine.config to where my application was. I then passed --machine-config machine.config to mkbundle.

All of these steps are pretty confusing and frustrating, why is not as simple as just typing mkbundle --deps app.exe? I tried making a change to the template used by mkbundle and compiling it myself, but it wont run. I've gone as far now as to download the mono source and attempt to build the whole thing, but I doubt it will work. If anyone can explain what the hell is going on with mkbundle to make this so annoying, I'd be interested in contributing.

Joe
  • 726
  • 1
  • 8
  • 18
0

after you have the temp.o and temp.c, you can add them to visual c++ to make a windows application with other sources.

Jiang YD
  • 3,205
  • 1
  • 14
  • 20