如何使"mkbundle --deps"选项与单声道 3.2.3 一起使用



我试图将应用程序与单声道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:userspiotrdesktopauthoringtoolUIbindebugUI.exe
 config from: C:userspiotrdesktopauthoringtoolUIbindebugUI.exe.config
   embedding: C:PROGRA~2MONO-2~1.9libmonogacgtk-sharp2.12.0.0__35e10195dab3c99fgtk-sharp.dll
   embedding: C:PROGRA~2MONO-2~1.9libmonogacglib-sharp2.12.0.0__35e10195dab3c99fglib-sharp.dll
   .
   .
   .
   embedding: C:PROGRA~2MONO-2~1.9libmono4.0Mono.Posix.dll
Machine config from: C:Program Files (x86)Mono-2.10.9etcmono4.0machine.config
Compiling:
as -o temp.o temp.s

有人知道这种行为的原因吗?我正在使用64位版本的Windows 7和在官方网站上找到的Cygwin。该代码已在Xamarin Studio 4.2和Visual Studio 2010中进行了编译和测试。

howto for cygwin mingw

用Mono 4.0.3
测试在Mono 4.0.3中,Mkbundle有效,但使其起作用可能很棘手。
首先,检查您的设置:

  • 在不包含空格的路径中安装单声道/gtk#(即,然后不编程文件)
  • 设置a mingw/cygwin 工作编译链(作为一个在窗户上编译单声道)。
  • 为mkbundle定义强制性环境变量
    • Mingw编译器位置应在Windows路径(由CMD使用)
    • pkg-config也应该在Windows路径中
  • 使用以下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

注意: - 在应用程序目录中复制mono-2.0.dll,因为它应沿捆绑的EXE

分配

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

  • 如果使用 -z ,也应复制Zlib1.dll。(请注意,GCC调用也更改)。您可能需要更多DLL,具体取决于您对框架功能的使用(不是详尽的列表:libglib*.dll,libgmodule*.dll,libgthread*.dll,iconv.dll,intl.dll,intl.dll)
  • -c 用于仅生成存根。
  • 您必须指定捆绑包所需的所有EXE和DLL 。
  • --keeptemp 如果MKBundle失败GCC调用,将保持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#Console Application 在Mono Github上)因此,可以根据您的需求轻松修改和重新编译。阅读代码也可能有助于了解其在下面的工作方式。
CMD 用法,因为MKBundle使用的不同命令是硬编码的,因此它将受益于某些参数化增强。

最新更新