28

mono 3.2.3 のアプリケーションをスタンドアロンの実行可能ファイルにバンドルしようとしています。そのために、私はこのガイドラインに従っています。変数を宣言した後:

mono_version="3.2.3"
export MONO=/cygdrive/c/progra~2/Mono-$mono_version
machineconfig=$PROGRAMFILES\\Mono-$mono_version\\etc\\mono\\4.5\\machine.config
export PATH=$PATH:$MONO/bin
export PKG_CONFIG_PATH=$MONO/lib/pkgconfig
export CC="i686-pc-mingw32-gcc -U _WIN32"

mkbundle --deps コマンドは、参照されているアセンブリをローカライズできません:

Unhandled Exception:
System.IO.FileNotFoundException: Could not load file or assembly 'gtk-sharp' or 
one of its dependencies. The system cannot find the file specified.
File name: 'gtk-sharp'

mono 2.10.9 でまったく同じ操作を実行します。

mono_version="2.10.9"
export MONO=/cygdrive/c/progra~2/Mono-$mono_version
machineconfig=$PROGRAMFILES\\Mono-$mono_version\\etc\\mono\\4.0\\machine.config
export PATH=$PATH:$MONO/bin
export PKG_CONFIG_PATH=$MONO/lib/pkgconfig
export CC="i686-pc-mingw32-gcc -U _WIN32"

mkbundle --deps --machine-config "$machineconfig" -c UI.exe

肯定的な結果が得られます:

OS is: Windows
WARNING:
  Check that the machine.config file you are bundling
  doesn't contain sensitive information specific to this machine.
Sources: 3 Auto-dependencies: True
   embedding: C:\users\piotr\desktop\authoringtool\UI\bin\debug\UI.exe
 config from: C:\users\piotr\desktop\authoringtool\UI\bin\debug\UI.exe.config
   embedding: C:\PROGRA~2\MONO-2~1.9\lib\mono\gac\gtk-sharp\2.12.0.0__35e10195dab3c99f\gtk-sharp.dll
   embedding: C:\PROGRA~2\MONO-2~1.9\lib\mono\gac\glib-sharp\2.12.0.0__35e10195dab3c99f\glib-sharp.dll
   .
   .
   .
   embedding: C:\PROGRA~2\MONO-2~1.9\lib\mono\4.0\Mono.Posix.dll
Machine config from: C:\Program Files (x86)\Mono-2.10.9\etc\mono\4.0\machine.config
Compiling:
as -o temp.o temp.s

そのような行動の理由を知っている人はいますか?Windows 7 の 64 ビット バージョンと、公式 Web サイトで見つけた Cygwin を使用しています。コードは、Xamarin Studio 4.2 および Visual Studio 2010 でコンパイルおよびテストされました。

4

1 に答える 1

1

cygwin + mingw での mkbundle のハウツー

mono 4.0.3 でテスト済み
mono 4.0.3 では、mkbundle は機能しますが、機能させるのは難しい場合があります。
まず、セットアップを確認します。

  • スペースを含まないパスに Mono/GTK# をインストールします(つまり、Program Files ではありません)。
  • MinGw/Cygwinで動作するコンパイル チェーンをセットアップします( Windows で mono をコンパイルするためのものとして)。
  • mkbundle の必須環境変数を定義します。
    • mingw コンパイラの場所は、Windows PATH にある必要があります (cmd で使用)
    • pkg-config も Windows PATH にある必要があります
  • 次の cygwin スクリプトを使用します (cmd で実行するように調整できます)。
# M_PREFIX refers to Mono installation
# For more information, search for prefix installation in Mono documentation
M_PREFIX='/cygdrive/c/Mono'

export DYLD_FALLBACK_LIBRARY_PATH=${M_PREFIX}/lib:${DYLD_FALLBACK_LIBRARY_PATH}
export LD_LIBRARY_PATH=${M_PREFIX}/lib:${M_PREFIX}/lib/mono/4.5:${LD_LIBRARY_PATH}
export C_INCLUDE_PATH=${M_PREFIX}/include:${C_INCLUDE_PATH}
export ACLOCAL_PATH=${M_PREFIX}/share/aclocal:${ACLOCAL_PATH}
export PKG_CONFIG_PATH=${M_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}
# Here we added the system32 to make cmd available to mkbundle
# /usr/bin is the default location for mingw
export PATH=${M_PREFIX}/bin:/cygdrive/c/Windows/system32:/usr/bin:${PATH}

export CC="i686-pc-mingw32-gcc -U _WIN32"

次に、実行できます:

mkbundle --deps --keeptemp my.exe my.dll -o bundled.exe

注: -バンドルされている exe に沿って配布する必要があるため、アプリケーション ディレクトリにコピーします。mono-2.0.dll

cp ${M_PREFIX}/bin/mono-2.0.dll .

  • を使用する場合-zは、zlib1.dll もコピーする必要があります。(gcc 呼び出しも変更されることに注意してください)。フレームワーク機能の使用状況によっては、さらに dll が必要になる場合があります (完全なリストではありません: libglib*.dll、libgmodule*.dll、libgthread*.dll、iconv.dll、intl.dll)。
  • -cスタブのみを生成するために使用されます。
  • バンドルに必要なすべての exe および dllを指定する必要があります。
  • --keeptempgcc の呼び出しで mkbundle が失敗した場合に便利な temp.c と temp.s を保持します。
  • gcc を手動で起動したい場合 (必要になる場合もあります):
i686-pc-mingw32-gcc -U _WIN32 -g -o output.exe -Wall temp.c $(pkg-config --cflags --libs mono-2)  temp.o

コンソール アプリケーションの場合

コンソール アプリケーションを機能させるには、gcc コマンドから-mwindowsを削除する必要があります。pkg-config --cflags --libs mono-2そのためには、 を呼び出して削除する必要があります-mwindows

その後、次のようなものを取得する必要があります。


    i686-pc-mingw32-gcc  -g -o output.exe -Wall temp.c -mms-bitfields -IC:/Mono/include/mono-2.0 -mms-bitfields  -LC:/Mono/lib -lmono-2.0 -lws2_32 -lpsapi -lole32 -lwinmm -loleaut32 -l advapi32 -lversion temp.s

誰でも mkbundle を改善できます

mkbundle はオープン ソースの C# コンソール アプリケーション( mono github ) であるため、必要に応じて簡単に変更および再コンパイルできます。コードを読むことは、その下でどのように機能するかを理解するのにも役立ちます. mkbundle で使用されるさまざまなコマンドがハードコードされているため、cmd の使用法は、パラメーター化の機能強化の恩恵を受けるでしょう

于 2015-10-03T19:35:51.703 に答える