我试图从控制台应用程序创建可执行文件。 我已经安装了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,单声道3.2.3,我在官方网站上找到的cygwin,xamarin studio 4.2和net framwork 4)
答案 0 :(得分:5)
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 (参见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
答案 1 :(得分:0)
答案 2 :(得分:-1)
您可以在此处找到更新的howto make mkbundle work on Windows
首先,检查您的设置:
然后你可以运行:
mono-2.0.dll
备注:强>
复制--keeptemp
应用程序目录,因为它应该沿着捆绑的exe分发
您必须指定捆绑包所需的所有exe和dll 。
i686-pc-mingw32-gcc -U _WIN32 -g -o output.exe -Wall temp.c $(pkg-config --cflags --libs mono-2) temp.o
会保留temp.c和temp.s,如果mkbundle在gcc调用时失败,这可能会派上用场。library(gridExtra)
mkbundle是一个开源的C#控制台应用程序( on mono github )
因此可以根据您的需要轻松修改和重新编译。
阅读代码也有助于理解它是如何在下面工作的。