无法使用mkbundle编译简单的C#应用​​程序

时间:2010-12-17 20:45:30

标签: mono mkbundle

我写了一些控制台“Hello world”的应用程序。并遵循c# cywgwin mono mkbundle windows 7 - cannot compile file回答。但我得到了:

$ 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中。

3 个答案:

答案 0 :(得分:13)

首先,准备开发环境:

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

    export PKG_CONFIG_PATH=/cygdrive/c/Soft/Mono/lib/pkgconfig
    export PATH=$PATH:/cygdrive/c/Soft/Mono/bin
    
  6. 重启Cygwin Bash shell。

  7. 之后,您可以使用“mkbundle”编译程序集:

    1. 执行以下命令:“mkbundle -c -o host.c -oo bundle.o --deps YourAssembly.exe <additional arguments>”。您也可以选择传递“-z”来压缩结果包。你应该得到“host.c”和“bundle.o”文件。
    2. 在“host.c”中,您应删除“_WIN32”“branch”(“#include <windows.h>”除外)。它不起作用。您可以通过在其后面的行中添加“#undef _WIN32”来执行此操作:

      #ifdef _WIN32
      #include <windows.h>
      #endif
      

      所以你会得到:

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

    4. 您将获得“ResultantBundle.exe”。这是您的Mono应用程序打包为独立可执行文件。
    5. 它仍然需要“mono-2.0.dll”以及您在开发过程中依赖的一些额外的DLL和资源(例如,它可能需要GTK#native DLL-s)但它不需要完整的Mono运行时运行。

答案 1 :(得分:1)

只是想补充一点,如果你将-z传递给mkbundle,那么你需要将-lz传递给gcc。我有一些问题,使用winforms和net访问的应用程序正常工作,我不得不将machine.config从C:\ Mono \ etc \ mono \ 4.0 \ machine.config复制到我的应用程序所在的位置。然后我将--machine-config machine.config传递给了mkbundle。

所有这些步骤都令人困惑和令人沮丧,为什么不像只输入mkbundle --deps app.exe那么简单?我尝试对mkbundle使用的模板进行更改并自行编译,但它不会运行。我已经走了很远,现在下载单声道源并尝试构建整个东西,但我怀疑它会起作用。如果有人能用mkbundle解释到底是怎么回事来让这件事变得很烦人,那我就有兴趣做贡献了。

答案 2 :(得分:0)

获得temp.o和temp.c之后,可以将它们添加到visual c ++中,以便与其他源一起创建一个Windows应用程序。