首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在windows上使用mkbundle创建C#可执行文件

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

Stack Overflow用户
提问于 2013-11-26 11:29:01
回答 3查看 4.7K关注 0票数 6

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

代码语言:javascript
运行
复制
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 Studio4.2和net Framwork4)

EN

回答 3

Stack Overflow用户

发布于 2014-02-12 19:18:46

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

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

代码语言:javascript
运行
复制
export PKG_CONFIG_PATH=/cygdrive/c/progra~1/Mono-3.2.3/lib/pkgconfig

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

代码语言:javascript
运行
复制
# 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
票数 6
EN

Stack Overflow用户

发布于 2013-11-26 19:21:56

前段时间我也遇到了同样的问题,并为cygwin编写了一个脚本。你可以尝试一下,它是否还能工作会很有趣:

mkbunde cygwin script

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

票数 0
EN

Stack Overflow用户

发布于 2015-10-04 03:39:37

如何在cygwin + mingw上使用mkbundle

您可以在此处找到更新后的howto make mkbundle work on Windows

首先,检查您的设置:

  • 在不包含空格的路径中安装Mono/GTK# (即不是程序文件)
  • 设置MinGw/Cygwin工作编译链(作为the one for compiling mono on windows)。
  • 为mkbundle定义必需的环境变量
    • mingw编译器的位置应该在Windows路径中( cmd)
    • pkg-config使用的位置也应该在Windows PATH

  • 使用cygwin脚本定义mono和mingw所需的变量。

然后,您可以运行:

代码语言:javascript
运行
复制
mkbundle --deps --keeptemp my.exe my.dll -o bundled.exe

备注:

应随捆绑的exe

  • You一起分发的应用程序目录中的
  • Copy mono-2.0.dll 必须指定bundle.
  • --keeptemp所需的所有exe和dll将保留temp.c和temp.s,这可能会派上用场如果mkbundle上的mkbundle失败,您想手动调用gcc (可能需要):

代码语言:javascript
运行
复制
i686-pc-mingw32-gcc -U _WIN32 -g -o output.exe -Wall temp.c $(pkg-config --cflags --libs mono-2)  temp.o

任何人都可以改进mkbundle

mkbundle是一个开源的C#控制台应用程序 (),因此可以根据您的需要轻松地进行修改和重新编译。阅读代码也可以帮助理解它是如何工作的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20207965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档