1

我目前正在尝试让我的 C# 程序在 Linux 上运行。在我的 Linux 机器上使用 mono,程序运行良好。所以我使用了 mkbundle,它全部编译正确。但是当我尝试在任何其他 Linux 机器上运行捆绑的程序时,我得到了这个错误:

Unhandled Exception: System.TypeInitializationException: An exception was thrown by the 
type initializer for System.Windows.Forms.XplatUI ---> 
System.TypeInitializationException: An exception was thrown by the type initializer for 
System.Drawing.GDIPlus ---> System.DllNotFoundException: libgdiplus.so.0

这是我使用的 mkbundle 命令:

mkbundle --static program.exe --deps -o a.out

我也尝试使用 mkbundle2 没有运气。

我想也许有一种方法可以专门包含带有 mkbundle 的库(比如告诉在哪里可以找到 libgdiplus)。当我使用 mkbundle 时它应该被链接,但我想这不是因为当我在任何其他 Linux 机器上运行我的程序(不是运行单声道)时,我得到了这个错误。

两台机器都运行 Ubuntu 10.10 AMD64。

4

3 回答 3

6

windows 的 mono 3.0 配置文件在 libgdiplus 引用中有错误的条目。

将文件 C:\Program Files (x86)\Mono-3.0.2\etc\mono\config 的两行更改如下:

 <dllmap dll="gdiplus" target="/tmp/install/lib/libgdiplus.so" os="!windows"/>
 <dllmap dll="gdiplus.dll" target="/tmp/install/lib/libgdiplus.so" os="!windows"/>
于 2012-12-23T20:24:04.770 回答
2

外部帮助程序库未捆绑在可执行文件中,因此您需要同时分发 libgdiplus,或者使用 -oo 选项创建一个目标文件,您将在程序中将其与所需的库链接在一起。当然,您还必须添加一个 dllmap 条目以从例如 libgdiplus 映射到 __Internal。

请注意,如果您只是按原样分发 mkbundle 生成的程序,那么您就违反了 mono 的自由软件许可证,因此除非您拥有 Novell 的特殊许可证,或者您的程序是自由软件,或者您还分发了目标文件应用程序,以便人们可以重新链接自己,你不应该使用 mkbundle。

于 2010-11-08T07:23:38.380 回答
0

如果在您的“外国”机器上运行以下命令:

ldd a.out

您应该能够看到它所期望的共享库。您可能需要将 libgdiplus.so 与您的程序一起分发,或者可能需要在 libgdiplus.a 中静态链接

于 2011-04-05T09:52:07.563 回答