使用mkbundle将Mono GTK#app移植到其他平台

时间:2011-07-02 22:44:42

标签: c# mono monodevelop gtk#

我是一名长期的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服务器时失败,这似乎可以预期,因为 Mono.Webserver 可能没有安装我的Ubuntu机器。在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 目录有关的一些问题。这是真的?如果是的话,我需要做些什么让它起作用?

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

祝你好运, 塞巴斯蒂安

PS。我也在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命令会产生4.9 MB的Unix归档,其中包含所有必需的依赖项。当我在Mac上双击这个新文件时,会弹出一个终端窗口并启动我的应用程序。甜!但这在Windows和Ubuntu中都不起作用。

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

我希望收到的是可以在Windows和Ubuntu中运行的捆绑可执行文件。到目前为止,我还没有遇到过让我这样做的解决方案。我试图在我的Windows 7机器上安装MonoDevelop,复制我的解决方案并在那里构建它。但由于我的应用依赖于Mono.WebServer2库,我无法在Windows上构建它。我无法在互联网上的任何地方找到Mono.WebServer2.dll来下载Windows。

1 个答案:

答案 0 :(得分:1)

首先,这种情况包括两个单独的问题,我将分别讨论:

  1. 架构 - 仅限i386
  2. 构建和打包
  3. <强> 1。体系结构

    首先,并非所有Windows和Linux计算机都在i386架构上运行,因此请确保使用的是i386架构。它们更有可能是i386,但是Linux可以很容易地运行在许多架构上,而且最近Windows也开始尝试使用新的平板电脑cpu类型(他们过去支持它,但它很快就失去了支持)。

    <强> 2。构建和打包

    当定位任何操作系统时,打包路径必然存在差异,因此您应该为每个目标操作系统构建该目标操作系统。如果你想让mkbundle在Windows上运行,那么需要在那里安装整个工具链,而Windows需要一个特殊的脚本来实现它,但是由于mkbundle是针对类Unix操作系统而设计的,所以它应该在Linux上运行而不需要特别考虑:

    Create C# executable with mkbundle on windows

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