我正在尝试将C#Mono应用程序构建为本机二进制文件,因此它可以在没有任何依赖性的Linux系统上运行(例如Mono)。
为了确保一些向后兼容性,我使用Ubuntu 12.04来构建本机二进制文件。我必须从源代码构建Mono 3.x,因为Ubuntu 12.04只有Mono 2的软件包。如果你有兴趣,我会记录that process here。
我使用mkbundle捆绑Mono运行时及其依赖项:
mkbundle -c -o WFTOLauncherNative.c -oo bundles.o --static --deps WFTOLauncher.exe Open.NAT.dll
我正在使用cc编译器:
cc -o WFTOLauncherNative.exe WFTOLauncherNative.c bundles.o -l:libmono-2.0.a -l:libgdiplus.a -lc -lpthread -lrt -lm -ldl -I /usr/local/include/mono-2.0/
这适用于我构建的系统(Ubuntu 12.04)。但是在没有安装Mono的Ubuntu 14.04上,我收到以下错误:
Unhandled Exception:
System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.XplatUI ---> System.DllNotFoundException: libc
应用程序的ldd:
scott@ubuntu:/media/strichnet/WFTOLauncher/bin/Release/LinuxNative$ ldd WFTOLauncherNative.exe
linux-vdso.so.1 => (0x00007fffd0ffe000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa6c794a000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa6c7d27000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa6c772c000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fa6c7523000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa6c721d000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa6c7019000)
到目前为止,我的预感是Mono在这里有问题 - 我认为它依赖于Mono DllMap配置从libc映射到libc.so.6,但它失败了。 SO上有一个类似的问题,而answer here看起来很有希望,但是我的目标是创建一个独立的原生程序集,这不是我能接受的解决方案。
我已将/ etc / mono / config中的默认Mono 3配置文件复制到二进制目录,并将其重命名为WFTOLauncher.exe.config和WFTOLauncherNative.exe.config(以防万一)。这没有帮助。
此处完整的单声道调试跟踪:https://gist.github.com/strich/e71b23421cdbe941b4f4
答案 0 :(得分:1)
问题的根本原因是Mono正在寻找libc.so,其中操作系统只有libc.so.6。 Mono需要一个DllMap配置文件来理解如何翻译它。
该问题的解决方案是将默认的Mono3 DllMap配置文件添加到与我的二进制文件相同的目录中。遗憾的是,似乎Mono并没有为进程全局缓存DllMap,因此我不得不在被调用的各种模块的不同名称下制作配置文件的多个副本。例如:
Mono.Posix.dll.config
System.Drawing.dll.config
System.Windows.Forms.dll.config