试图运行单声道捆绑程序,但缺少libgdiplus异常

时间:2010-11-07 23:15:45

标签: mono gdi+ mkbundle

我目前正在尝试让我的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。

3 个答案:

答案 0 :(得分: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"/>

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

如果在您的“外国”机器上运行:

ldd a.out

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