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 マシン (mono を実行していない) でプログラムを実行すると、このエラーが発生するため、そうではないと思います。

どちらのマシンも Ubuntu 10.10 AMD64 を実行しています。

4

3 に答える 3

6

windosのmono3.0設定ファイルには、libgdiplus参照のエントリが正しくありません。

ファイルC:\ Program Files(x86)\ Mono-3.0.2 \ etc \ mono\configの2行を次のように変更します。

 <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 オプションを使用して、必要なライブラリと共にプログラム内でリンクするオブジェクト ファイルを作成する必要があります。もちろん、たとえば libgdiplus から __Internal にマップする dllmap エントリも追加する必要があります。

mkbundle によって生成されたプログラムをそのまま配布する場合は、mono のフリー ソフトウェア ライセンスに違反していることに注意してください。したがって、たとえば、Novell から特別なライセンスを取得している場合や、プログラムがフリー ソフトウェアである場合、またはオブジェクト ファイルも配布している場合を除きます。人々が自分自身を再リンクできるようにするには、mkbundle を使用しないでください。

于 2010-11-08T07:23:38.380 に答える
0

「外部」マシンでこれを実行する場合:

ldd a.out

期待している共有ライブラリを確認できるはずです。プログラムで libgdiplus.so を配布するか、libgdiplus.a に静的にリンクする必要がある場合があります。

于 2011-04-05T09:52:07.563 に答える