Our super computing cluster at the VLSCI is currently running Red Hat Enterprise Linux. While we can simply send the helpdesk a request to get pretty much any free applications / libraries installed on the cluster, asking them to install Mono seemed embarrassing. So I set about making a simple .Net assembly work on the cluster.
Mono includes a tool called "mkbundle" which allows for the bundling of .Net assemblies into single executables with no dependencies on mono.
I run Linux Mint for my normal Linux development, which doesn't seem to be fully compatible with RHEL, due to differences in glibc versions and countless other things. Therefore, running the usual mkbundle run on my executable "mono-mem.exe" (which was compiled by VS2010 on windows):
mkbundle mono-mem.exe -o mono-mem.broken --deps --static -z
(where "mono-mem.broken" is our output and "-z" tells it to zip the libraries)
Will not result in an executable that will run on RHEL, instead you'll end up with output like:
[terences@merri mono-mem]$ ./mono-mem.broken
./mono-mem.broken: /lib64/libc.so.6: version `GLIBC_2.9' not found (required by ./mono-mem.broken)
./mono-mem.broken: /lib64/libc.so.6: version `GLIBC_2.11' not found (required by ./mono-mem.broken)
./mono-mem.broken: /lib64/libc.so.6: version `GLIBC_2.8' not found (required by ./mono-mem.broken)
/mkbundle -c -o mono-mem.c -oo bundle.o --deps mono-mem.exe reference_library.dll
cc mono-mem.c bundles.o /PATH_TO_LIBS/mono-2.10/lib64/libMonoPosixHelper.so /PATH_TO_LIBS/mono-2.10/lib64/libmono-2.0.a -I/PATH_TO_LIBS/mono-2.10/include -L/PATH_TO_LIBS/mono-2.10/lib64 -lpthread -lc -lrt -lm -ldl -lz -omono-mem.o