Mono 无法使用mkbundle编译简单C应用程序

Mono 无法使用mkbundle编译简单C应用程序,mono,mkbundle,Mono,Mkbundle,我已经编写了一些类似于Hello world的控制台应用程序。并遵循了答案。但我有: $ mkbundle -o Fur Furries.exe --deps -z OS is: Windows Sources: 1 Auto-dependencies: True embedding: C:\Monotest\Furries.exe compression ratio: 40.43% embedding: C:\Soft\Mono\lib\mono\4.0\mscorlib.dll

我已经编写了一些类似于Hello world的控制台应用程序。并遵循了答案。但我有:

$ mkbundle -o Fur Furries.exe --deps -z
OS is: Windows
Sources: 1 Auto-dependencies: True
  embedding: C:\Monotest\Furries.exe
  compression ratio: 40.43%
  embedding: C:\Soft\Mono\lib\mono\4.0\mscorlib.dll
  compression ratio: 34.68%
Compiling:
as -o temp.o temp.s
gcc -mno-cygwin -g -o Fur -Wall temp.c `pkg-config --cflags --libs mono-2|dos2un
ix` -lz temp.o
temp.c: In function `main':
temp.c:173: warning: implicit declaration of function `g_utf16_to_utf8'
temp.c:173: warning: assignment makes pointer from integer without a cast
temp.c:188: warning: assignment makes pointer from integer without a cast
/tmp/ccQwnxrF.o: In function `main':
/cygdrive/c/Monotest/temp.c:173: undefined reference to `_g_utf16_to_utf8'
/cygdrive/c/Monotest/temp.c:188: undefined reference to `_g_utf16_to_utf8'
collect2: ld returned 1 exit status
[Fail]

它在Windows XP中。

首先,准备开发环境:

安装Mono。例如,您已将其安装到C:\Soft\Mono中。 安装Cygwin。选择要安装的软件包时,请选择以下内容:gcc mingw、mingw zlib、pkg config、nano。 使用link或Bash-login-i命令启动Cygwin Bash shell。 使用nano nano~/.bashrc打开$HOME/.bashrc。不要使用不保留行尾CR、LF、CR/LF或其他内容的编辑器,否则会损坏文件! 在文件末尾添加以下行:

export PKG_CONFIG_PATH=/cygdrive/c/Soft/Mono/lib/pkgconfig
export PATH=$PATH:/cygdrive/c/Soft/Mono/bin
重新启动Cygwin Bash shell

之后,您可以使用mkbundle编译程序集:

执行以下命令:mkbundle-c-o host.c-oo bundle.o-deps yoursassembly.exe。您还可以选择传递-z来压缩结果束。您应该获得host.c和bundle.o文件。 在host.c中,除了包含一个外,您应该删除_WIN32分支。它不起作用。只需在其中的以下行之后添加undef _WIN32即可:

#ifdef _WIN32
#include <windows.h>
#endif
因此,您将得到:

#ifdef _WIN32
#include <windows.h>
#endif
#undef _WIN32
执行以下命令:gcc-mno cygwin-o ResultantBundle.exe-Wall host.c`pkg config-cflags-libs mono-2 | dos2unix`bundle.o。如果在步骤2中添加了-z附加参数,则必须在此步骤中添加-lz附加参数

您将得到resultbundle.exe。这是作为独立可执行文件打包的Mono应用程序。 它仍然需要mono-2.0.dll和一些额外的dll-s以及开发过程中依赖的资源。例如,它可能需要GTK原生dll-s,但不需要运行完整的mono运行时。
只是想补充一点,如果将-z传递给mkbundle,那么需要将-lz传递给gcc。我在使用winforms和net access运行应用程序时遇到一些问题,我必须将machine.config从C:\Mono\etc\Mono\4.0\machine.config复制到我的应用程序所在的位置。然后我将-machine-config machine.config传递给mkbundle


所有这些步骤都非常混乱和令人沮丧,为什么不像键入mkbundle-deps app.exe那么简单呢?我尝试对mkbundle使用的模板进行更改并自己编译,但它无法运行。我已经下载了mono源代码,并尝试构建整个系统,但我怀疑它是否会起作用。如果有人能解释MKBAM到底是怎么回事,让它这么烦人,我会管他的。

< P>在你有了To.o和Time.c之后,你可以把它们添加到VisualC++中,用其他的源码制作一个Windows应用程序。这会触发LGPL的东西,但是如果askers应用程序已经是开源的,这通常不是什么大问题。Squeaky,这是一个很好的建议,但我没有足够的时间来测试它。你能查一下吗?我会查的,但过一两天就不会查了。我正在为一个库创建SWIG绑定。我们需要C绑定,等等,一旦我这样做了,我将在这里发布发现。