首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使"mkbundle --deps“选项与mono 3.2.3一起工作

如何使"mkbundle --deps“选项与mono 3.2.3一起工作
EN

Stack Overflow用户
提问于 2014-03-06 13:50:55
回答 1查看 2K关注 0票数 28

我正在尝试将应用程序与mono 3.2.3捆绑到一个独立的可执行文件中。为此,我遵循准则。声明变量之后:

代码语言:javascript
复制
mono_version="3.2.3"
export MONO=/cygdrive/c/progra~2/Mono-$mono_version
machineconfig=$PROGRAMFILES\\Mono-$mono_version\\etc\\mono\\4.5\\machine.config
export PATH=$PATH:$MONO/bin
export PKG_CONFIG_PATH=$MONO/lib/pkgconfig
export CC="i686-pc-mingw32-gcc -U _WIN32"

mkbundle -deps命令无法本地化引用的程序集:

代码语言:javascript
复制
Unhandled Exception:
System.IO.FileNotFoundException: Could not load file or assembly 'gtk-sharp' or 
one of its dependencies. The system cannot find the file specified.
File name: 'gtk-sharp'

使用mono2.10.9执行完全相同的操作:

代码语言:javascript
复制
mono_version="2.10.9"
export MONO=/cygdrive/c/progra~2/Mono-$mono_version
machineconfig=$PROGRAMFILES\\Mono-$mono_version\\etc\\mono\\4.0\\machine.config
export PATH=$PATH:$MONO/bin
export PKG_CONFIG_PATH=$MONO/lib/pkgconfig
export CC="i686-pc-mingw32-gcc -U _WIN32"

mkbundle --deps --machine-config "$machineconfig" -c UI.exe

取得了积极成果:

代码语言:javascript
复制
OS is: Windows
WARNING:
  Check that the machine.config file you are bundling
  doesn't contain sensitive information specific to this machine.
Sources: 3 Auto-dependencies: True
   embedding: C:\users\piotr\desktop\authoringtool\UI\bin\debug\UI.exe
 config from: C:\users\piotr\desktop\authoringtool\UI\bin\debug\UI.exe.config
   embedding: C:\PROGRA~2\MONO-2~1.9\lib\mono\gac\gtk-sharp\2.12.0.0__35e10195dab3c99f\gtk-sharp.dll
   embedding: C:\PROGRA~2\MONO-2~1.9\lib\mono\gac\glib-sharp\2.12.0.0__35e10195dab3c99f\glib-sharp.dll
   .
   .
   .
   embedding: C:\PROGRA~2\MONO-2~1.9\lib\mono\4.0\Mono.Posix.dll
Machine config from: C:\Program Files (x86)\Mono-2.10.9\etc\mono\4.0\machine.config
Compiling:
as -o temp.o temp.s

有人知道这种行为的原因吗?我使用64位版本的windows 7和我在官方网站上找到的Cygwin。代码是在4.2和Visual 2010上编译和测试的。

EN

回答 1

Stack Overflow用户

发布于 2015-10-03 19:35:51

如何在cygwin + mingw上使用mkbundle

用mono 4.0.3测试

在mono4.0.3中的,mkbundle可以工作,但是要使它工作起来可能很棘手。

首先,检查您的设置:

  • 在不包含空格的路径中安装Mono/GTK# (即不包含程序文件)
  • 设置一个MinGw/Cygwin工作编译链(作为用于在windows上编译mono的)。
  • 为mkbundle:定义强制性环境变量:
    • mingw编译器位置应该在Windows路径中(由cmd使用)
    • 也应该在Windows路径中

  • 使用以下cygwin脚本(可以在cmd上运行)

M_PREFIX参考Mono安装#以获得更多信息,在Mono文档中搜索前缀安装M_前缀=‘/cygdrive/c/Mono’导出DYLD_FALLBACK_LIBRARY_PATH=${M_PREFIX}/lib:${DYLD_FALLBACK_LIBRARY_PATH}导出LD_LIBRARY_PATH=${M_PREFIX}/lib:${M_PREFIX}/lib/mono/4.5:${LD_LIBRARY_PATH}导出C_INCLUDE_PATH=${M_PREFIX}/include:${C_INCLUDE_PATH}导出ACLOCAL_PATH=${M_PREFIX}/共享/aclocal:${导出PKG_CONFIG_PATH=${M_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH} #我们在这里添加了使mkbundle # /usr/bin可以使用cmd的system32,这是明威导出PATH=${M_PREFIX}/bin:/cygdrive/c/Windows/system32:/usr/bin:${PATH}导出CC=“i 686-pc-mingw32-gcc -U _WIN32”的默认位置。

然后你就可以跑:

代码语言:javascript
复制
mkbundle --deps --keeptemp my.exe my.dll -o bundled.exe

mono-2.0.dll注释:应用程序目录中的-复制,因为它应该沿着捆绑的exe分发。

代码语言:javascript
复制
cp ${M_PREFIX}/bin/mono-2.0.dll .

  • 如果使用-z,也应该复制zlib1.dll。(请注意gcc的调用也有变化)。您可能需要更多的dll,这取决于您对框架特性的使用(并非详尽无遗的列表: libglib*.dll、libgmodule*.dll、libgthread*.dll、iconv.dll、intl.dll)
  • -c只用于生成存根。
  • 您必须指定包所需的、all exe和dll
  • --keeptemp将保留tem.c和tem.s,如果mkbundle在gcc调用中失败,它们可能会派上用场。
  • 如果您想手动调用gcc (可能需要):
代码语言:javascript
复制
i686-pc-mingw32-gcc -U _WIN32 -g -o output.exe -Wall temp.c $(pkg-config --cflags --libs mono-2)  temp.o

用于控制台应用程序

要使控制台应用程序正常工作,必须从gcc命令中删除-mwindows。要做到这一点,您必须调用pkg-config --cflags --libs mono-2并删除-mwindows

你以后应该得到这样的东西:

代码语言:javascript
复制
    i686-pc-mingw32-gcc  -g -o output.exe -Wall temp.c -mms-bitfields -IC:/Mono/include/mono-2.0 -mms-bitfields  -LC:/Mono/lib -lmono-2.0 -lws2_32 -lpsapi -lole32 -lwinmm -loleaut32 -l advapi32 -lversion temp.s

任何人都可以改进mkbundle。

mkbundle是一个开源的C#控制台应用程序 (论单一github),因此可以根据需要轻松地修改和重新编译它。阅读代码也有助于理解它在下面是如何工作的。

mkbundle所使用的不同命令的cmd使用是硬编码的,因此它将受益于一些参数化增强。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22226519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档