是否可以使用使用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的使用?
感谢您提供任何帮助或指导
答案 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
,更新prefix
和exec_prefix
,并使用PKG_CONFIG_PATH环境变量来选择该版本
请注意,我从未真正尝试过后者,但没有理由认为它不起作用,因为pkg-config
是mkbundle
获取库路径的地方。< / 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