我试图从控制台应用程序创建可执行文件。
我已经安装了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和网络框架4)
最佳答案
Windows下的当前单声道版本中仍然存在此问题。发生这种情况是因为单声道团队将默认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 (请参阅this第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
关于c# - 在Windows上使用Mkbundle创建C#可执行文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20207965/