1

是否可以使用使用 sgen GC 的 mkbundle 捆绑 Mono 可执行文件?

我假设因为生成的包需要 libmono-2.0.so.1 而不是 libmonosgen-2.0.so,所以它使用标准的 boehm GC。我尝试过使用 $MONO_OPTIONS=--gc=sgen 但生成的包仍然需要非 sgen 库。

我是否误解了 libmono 和 libmonsgen 库的使用?

感谢您的任何帮助或指导

4

2 回答 2

1

这有点棘手,因为 Mono 实际上有两个独立的可执行文件和两个独立的库,每个垃圾收集器一个。例如,如果你运行mono --gc=sgen ...,mono 实际上会执行一个execvp()ofmono-sgen ...来切换到不同的可执行文件。

同样,mkbundle将用于pkg-config选择库并链接其中一个(即,以系统默认值为准)。要获取另一个库,有两种选择:

一种是使用 sgen 作为默认值来重建 Mono。显然,这可能不是一个可行的解决方案。

另一种方法是用于pkg-config覆盖选择。您将创建 的副本mono-2.pc,替换-lmono-2.0-lmonosgen-2.0,更新prefixexec_prefix使用 PKG_CONFIG_PATH 环境变量来选择该版本。

请注意,我从未真正尝试过后者,但没有理由让它不起作用,因为pkg-config它是从哪里mkbundle获取库路径的。

于 2013-06-28T09:23:56.947 回答
0

感谢您提出这个问题,因为它可以帮助我确定为什么我的一个应用程序在与 mkbundle 捆绑后运行速度太慢。这是因为使用了 Boehm GC 引擎。

要包含 SGen,您只需使用 --keeptemp 标志调用 mkbundle,然后重写编译器命令(由 mkbundle 打印)以包含 monosgen-2 而不是 mono-2。

示例:(适用于 Mac,但可以轻松地为 Linux 重写)

export PATH=/Library/Frameworks/Mono.framework/Commands/:$PATH
export AS="as -arch i386"
export CC="cc -arch i386 -framework CoreFoundation -lobjc -liconv"

mkbundle TestApp.exe --deps --static -o TestAppBundleName --keeptemp

cc -arch i386 -framework CoreFoundation -lobjc -liconv -o TestAppBundleName -Wall `pkg-config --cflags monosgen-2` temp.c  `pkg-config --libs-only-L monosgen-2` `pkg-config --variable=libdir monosgen-2`/libmonosgen-2.0.a `pkg-config --libs-only-l monosgen-2 | sed -e "s/\-lmonosgen-2.0 //"` temp.o
于 2015-04-12T04:41:51.587 回答