在Windows上使用mkbundle创建C#可执行文件

我试图从控制台应用程序创建一个可执行文件。 我已经安装了mono,cygwin(mingw-gcc,mingw-zlib1,mingw-zlib-devel,pkg-config),我已将以下行添加到我的.bashrc文件中

export PKG_CONFIG_PATH=/cygdrive/c/progra~1/Mono-3.2.3/lib/pkgconfig export PATH=$PATH:/cygdrive/c/progra~1/Mono-3.2.3/bin export CC="i686-pc-mingw32-gcc -U _WIN32" 

但每次我尝试使用mkbundle时,我都会收到以下消息 在此处输入图像描述

有没有办法让mkbundle在Windows上正常工作。?

(我使用的是Windows 7 x86,mono 3.2.3,我在官方网站上找到的cygwin,xamarin studio 4.2和net framwork 4)

在Windows下的当前单声道版本中仍然存在此问题。 这是因为单声道团队将默认GC切换到SGEN。 因此,当您尝试使用mkbundle时,您可以在错误中看到mkbundle实用程序尝试查找mono-2库,但此lib未包含在安装程序中且您有失败。 要解决此问题,您应该将mkbundle配置为使用libmonosgen-2.0而不是mono-2 。 我们试着这样做。

关键时刻是设置此变量:

 export PKG_CONFIG_PATH=/cygdrive/c/progra~1/Mono-3.2.3/lib/pkgconfig 

如果你去这个目录,你会看到很多* .pc文件(包配置)。 此文件负责在捆绑过程中配置链接库。 由于某些原因,mono team硬编码包配置文件和库到mono-2 (参见第492行)。 如果不重建mkbundle我们怎么能解决它? 解决方案是使用下一个bundle脚本:

 # Mono paths 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 # Compiller export CC="i686-pc-mingw32-gcc -U _WIN32" # Output file name output_name=Prog.exe # Produce stub only, do not compile mkbundle --deps --machine-config "$machineconfig" -c Program.exe # Produce helper object file. You may see errors at this step but it's a side effect of this method. mkbundle --deps --machine-config "$machineconfig" -oo temp.o Program.exe # Compile. Pay attention where I use monosgen-2 i686-pc-mingw32-gcc -U _WIN32 -g -o "$output_name" -Wall temp.c `pkg-config --cflags --libs monosgen-2` temp.o # Copy libmonosgen-2.dll cp $MONO/bin/libmonosgen-2.0.dll . # Run ./$output_name 

前段时间我遇到了同样的问题并为cygwin制作了一个脚本。 你可以尝试一下,它是否仍然有用会很有趣:

mkbunde cygwin脚本

脚本中有解释如何设置环境。

如何在cygwin + mingw上使用mkbundle

在这里,您可以找到更新的如何使mkbundle在Windows上运行

首先,检查您的设置:

  • 不包含空格路径中安装Mono / GTK#(即不是Program Files)
  • 设置一个MinGw / Cygwin工作编译链(作为在Windows上编译单声道的编译链)。
  • 为mkbundle定义必需的环境变量
    • mingw编译器位置应该在Windows PATH中(由cmd使用)
    • pkg-config也应该在Windows PATH中
  • 使用cygwin脚本定义单声道和mingw所需的变量。

然后你可以运行:

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

笔记:

  • mono-2.0.dll复制到应用程序目录中,因为它应该沿着捆绑的exe分发

  • 您必须指定捆绑包所需的所有exe和dll

  • --keeptemp将保留temp.c和temp.s如果mkbundle在gcc调用时失败,这可能会派上用场。
  • 如果你想手动调用gcc(可能需要):
 i686-pc-mingw32-gcc -U _WIN32 -g -o output.exe -Wall temp.c $(pkg-config --cflags --libs mono-2) temp.o 

任何人都可以改进mkbundle

mkbundle是一个开源的C#控制台应用程序在mono github上 ),因此可以根据您的需要轻松修改和重新编译。 阅读代码也有助于理解它在底层的工作原理。