我是一名长期的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。
答案 0 :(得分:1)
首先,这种情况包括两个单独的问题,我将分别讨论:
<强> 1。体系结构强>
首先,并非所有Windows和Linux计算机都在i386架构上运行,因此请确保使用的是i386架构。它们更有可能是i386,但是Linux可以很容易地运行在许多架构上,而且最近Windows也开始尝试使用新的平板电脑cpu类型(他们过去支持它,但它很快就失去了支持)。
<强> 2。构建和打包
当定位任何操作系统时,打包路径必然存在差异,因此您应该为每个目标操作系统构建该目标操作系统。如果你想让mkbundle在Windows上运行,那么需要在那里安装整个工具链,而Windows需要一个特殊的脚本来实现它,但是由于mkbundle是针对类Unix操作系统而设计的,所以它应该在Linux上运行而不需要特别考虑: