使用mkbundle将Mono GTK#应用程序移植到其他平台

12

我是一名长期从事C#开发的开发者,但对于Mono和特别是Gtk#还比较新。我已经使用C#和Gtk#开发了一个小应用程序。我需要这个应用程序在Windows、Linux和Mac上运行,因此我决定使用Mono,到目前为止,它似乎是一个很酷的框架。

我的简单应用程序启动基于用户选择的本地目录和端口的XSP Web服务器。理想情况下,我希望我的应用程序在开始之前无需安装Mono框架,但这不是必须的。我正在使用以下库:

using System; 
using Gtk; 
using System.Net; 
using Mono.WebServer; 
using System.Diagnostics; 
我正在Mac上进行开发(Snow Leopard,10.6.7)。 我的可执行文件在我的Mac上完美运行。 但是在Ubuntu和Windows上我遇到了问题。我的应用程序在Ubuntu(11.04)上部分工作 - 它启动并似乎在工作,但是当我尝试启动XSP Web服务器时失败了,这是可以预料的,因为我的Ubuntu机器上可能没有安装Mono.Webserver。在Windows(7,64位)上,我双击它后立即崩溃。崩溃报告告诉我发生了System.IO.FileNotFoundException错误。 可能是由于同样缺少XSP库造成的?无论如何,我在互联网上查找并了解了mkbundle。与各种论坛线程建议的一样,我已经进行了以下设置:
export AS="as -arch i386"

我已经导航到我的项目的 /bin/Release 目录,然后运行了以下命令:

mkbundle MivandoLocalServer.exe -o MivandoLocalServer --deps

但是我得到了以下输出,最终会失败:

Compiling: 
as -arch i386 -o temp.o temp.s 
cc -g -o MivandoLocalServer -Wall temp.c `pkg-config --cflags --libs mono-2`  temp.o 
Package mono-2 was not found in the pkg-config search path. 
Perhaps you should add the directory containing `mono-2.pc' 
to the PKG_CONFIG_PATH environment variable 
No package 'mono-2' found 
temp.c:2:36: error: mono/metadata/assembly.h: No such file or directory 
temp.c:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘assembly_bundle_MivandoLocalServer_exe’ 
temp.c:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token 
temp.c:18: error: ‘NULL’ undeclared here (not in a function) 
temp.c: In function ‘mono_mkbundle_init’: 
temp.c:22: warning: implicit declaration of function ‘mono_register_bundled_assemblies’ 
temp.c:22: error: ‘bundled’ undeclared (first use in this function) 
temp.c:22: error: (Each undeclared identifier is reported only once 
temp.c:22: error: for each function it appears in.) 
temp.c: In function ‘main’: 
temp.c:114: warning: implicit declaration of function ‘mono_set_dirs’ 
[Fail]

我真的不知道该从哪里入手。我已经安装了MacPorts,并且读到这可能会导致与pkg-config目录相关的一些问题。这是真的吗?如果是,我需要做什么才能让它正常工作?

希望有人能够帮助我。谢谢!

最好的祝福, Sebastian

附言:我也在Mono的主页论坛上发布了这个问题,但迄今没有回复。

更新:我怀疑MacPorts干扰了我的pkg-config目录设置。当我在终端中输入以下命令时,mkbundle允许我进行编译。但我仍然遇到了一些问题。

export PKG_CONFIG_PATH="/Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig/"
export AS="as -arch i386"
export CC="cc -arch i386"

执行以下mkbundle命令会生成一个Unix归档文件,大小为4.9 MB,其中包含所有必要的依赖项。当我在Mac上双击此新文件时,终端窗口弹出并启动我的应用程序。太棒了!但是在Windows和Ubuntu中无法工作。

mkbundle MivandoLocalServer.exe -o MivandoLocalServerBundle --deps -z

我想要得到的是一个捆绑在一起的可执行文件,可以在Windows和Ubuntu上运行。到目前为止,我还没有找到让我能够做到这一点的解决方案。我尝试在我的Windows 7机器上安装MonoDevelop,并将我的解决方案复制到那里进行构建。但由于我的应用程序依赖于Mono.WebServer2库,所以我无法在Windows上构建它。我在互联网上也没有找到下载Mono.WebServer2.dll的地方。


1
你是否尝试过(如编译器错误信息所建议的)“将包含'mono-2.pc'的目录添加到PKG_CONFIG_PATH环境变量中”? - corlettk
mono-2.pc 实际上就在那个路径中,这让我更加困惑。 - Sebastian Brandes
只是提供给其他搜索此问题的人参考。您可能需要添加导出以使配置路径正常工作。导出PKG_CONFIG_PATH=[路径] - ehsk
最好在你将要使用的操作系统上使用mkbundle,所以ubuntu应该在那里打包,而mac则在mac上。对于Windows来说,由于.NET的支持非常好,我不会仅仅使用标准的Windows工具进行分发。 - evolvedmicrobe
1个回答

1
首先,这种情况涉及到两个不同的问题,我将分别进行解释:
  1. 架构 - 仅限i386
  2. 构建和打包
1. 架构 首先,不是所有的Windows和Linux机器都运行在i386架构上,因此请确保您使用的是支持该架构的机器。虽然它们更可能是i386,但Linux可以轻松地运行在许多架构上,而Windows最近也走上了这条路(他们过去曾支持过,但很快就失去了支持),并且支持新的平板电脑CPU类型。 2. 构建和打包 当针对任何操作系统时,打包路径中必然会存在差异,因此您应该为每个目标操作系统构建相应的打包方式。如果您想让mkbundle在Windows上工作,则整个工具链需要安装在那里,并且Windows需要一个特殊的脚本才能正确使用它,但由于mkbundle是为类Unix OS而设计的,所以在Linux上应该可以正常工作。 在Windows上使用mkbundle创建C#可执行文件

http://linux.die.net/man/1/mkbundle


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接