使用Mono mkbundle来定位SGEN垃圾收集器

时间:2013-06-28 00:49:17

标签: mono garbage-collection sgen mkbundle

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

我认为因为生成的bundle需要libmono-2.0.so.1而不是libmonosgen-2.0.so它使用标准的boehm GC。我已经尝试使用$ MONO_OPTIONS = - gc = sgen但是生成的包仍然需要非sgen lib。

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

感谢您提供任何帮助或指导

2 个答案:

答案 0 :(得分:1)

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

同样,mkbundle将使用pkg-config选择库并链接其中一个(即系统默认值)。要获得其他库,有两种选择:

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

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

请注意,我从未真正尝试过后者,但没有理由认为它不起作用,因为pkg-configmkbundle获取库路径的地方。< / p>

答案 1 :(得分: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