Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Including GTK# Dlls with Statically Linked (mkbundle)Mono Exe on Mac

I have an application coded in c# using the Mono Framework and GTK# for UI.Im trying to create a static bundle for MacOSX (including gtk# and mono runtime)

I just bundled Mono with my exe file using

mkbundle --static hello.exe -o --deps hello2.exe

I got the exe file but when i drag it and put it on the terminal i get System.DllNotFound Exception:glibsharpglue-2

I understand that i need to include the gtk# libraries.But i dont know how to do that with a statically linked mono runtime.Is there an option to do that using mkbundle.All i need to get is a final standalone package ready to run on Mac.

Please help me out.

UPDATE: The shell script I'm currently using with Platypus to make the .app package

export DYLD_FALLBACK_LIBRARY_PATH="/Library/Frameworks/Mono.framework/Versions/Current/lib:$DYLD_FALLBACK_LIBRARY_PATH:/usr/lib"    
exec /Library/Frameworks/Mono.framework/Versions/Current/bin/mono myapp.exe

Im currently using the option provided in platypus to include myapp.exe file.How can i include the dlls required for GTK? Please help me out.

like image 796
techno Avatar asked Oct 30 '22 17:10

techno


1 Answers

The error is from not finding the GTK shared object libraries (SO/dylib).

Using mkbundle:

If using 32-bit Mono you will need to assign the arch type for AS and CC. By default, clang will compile and link x86_64 which may not match your installed Mono's arch type.

export AS="as -arch i386"
export CC="cc -arch i386 -framework CoreFoundation -lobjc -liconv"

mkbundle gtkdesigner.exe --deps -o gtkdemo

The resulting executable will still require Mono (and any dependant shared objects/dylibs) to be installed.

Or adding --static to statically link to mono libs and thus invoking the LGPL of Mono (you will need to distribute your original CIL images so the user can upgrade the version of Mono that is running your app, unless you have a license from Xamarin)

mkbundle --static gtkdesigner.exe --deps -o gtkdemo

The resulting executable will not require Mono to be installed, but any dependant shared objects/dylibs will still be required.

GTK/GTK# based applications:

A GTK# based application will still require the GTK shared objects/dylibs to be installed and accessible by the resulting executable (i.e. gtkdemo in this case):

Thus if you try to run ./gtkdemo it will need to find shared libraries such as libc.dylib, libgtksharpglue-2.so, etc, etc... otherwise the error you are getting will be shown.

Set the dylib library path to your GTK libraries, not the C# CIL binding library (GTK#), but the native shared object libraries. Since you have Mono installed on OS-X, it also installs its own version of GTK that can be found at /Library/Frameworks/Mono.framework/Versions/Current/lib. If you are installing your own version GTK to a different location just change the path to that location. You also will be to include the location of the OS's std C library.

export DYLD_FALLBACK_LIBRARY_PATH="/Library/Frameworks/Mono.framework/Versions/Current/lib:/usr/lib"
./gtkdemo

Note: You can package this gtkdemo application into a normal OS-X app by using a packager tool such as http://sveinbjorn.org/platypus. Package all the GTK libraries and any other required so/dylibs into the app and provide a shell script that assigns the DYLIB path in order to find those app based GTK libs. Then you can distribute the self-contained app and the end-user just double-clicks it to run you GTK-based app.

like image 186
SushiHangover Avatar answered Nov 15 '22 06:11

SushiHangover