6

我试图从控制台应用程序创建一个可执行文件。我已经安装了 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)

4

3 回答 3

6

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

关键时刻是设置这个变量:

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

如果你进入这个目录,你会看到很多*.pc文件(包配置)。该文件负责在捆绑过程中配置链接库。由于某些原因,mono 团队将包配置文件和库硬编码为mono-2(参见第 492 行)。我们如何在不重建mkbundle 的情况下修复它?解决方案是使用下一个捆绑脚本:

# 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
于 2014-02-12T11:18:45.737 回答
0

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

mkbunde cygwin 脚本

脚本中有关于如何设置环境的说明。

于 2013-11-26T11:21:55.667 回答
-1

如何在 cygwin + mingw 上使用 mkbundle

在这里您可以找到更新的如何使 mkbundle 在 Windows 上工作


首先,检查您的设置:

  • 在不包含空格的路径中安装 Mono/GTK# (即不是 Program Files)
  • 设置一个MinGw/Cygwin工作编译链(作为在 windows 上编译单声道的编译链)。
  • 为 mkbundle 定义必需的环境变量:
    • mingw 编译器位置应该在 Windows PATH 中(由 cmd 使用)
    • pkg-config 也应该在 Windows PATH 中
  • 使用 cygwin 脚本来定义 mono 和 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 上),因此可以根据您的需要轻松修改和重新编译它。阅读代码也有助于理解它在底层是如何工作的。

于 2015-10-03T19:39:37.397 回答