是否可以使用使用 sgen GC 的 mkbundle 捆绑 Mono 可执行文件?
我假设因为生成的包需要 libmono-2.0.so.1 而不是 libmonosgen-2.0.so,所以它使用标准的 boehm GC。我尝试过使用 $MONO_OPTIONS=--gc=sgen 但生成的包仍然需要非 sgen 库。
我是否误解了 libmono 和 libmonsgen 库的使用?
感谢您的任何帮助或指导
是否可以使用使用 sgen GC 的 mkbundle 捆绑 Mono 可执行文件?
我假设因为生成的包需要 libmono-2.0.so.1 而不是 libmonosgen-2.0.so,所以它使用标准的 boehm GC。我尝试过使用 $MONO_OPTIONS=--gc=sgen 但生成的包仍然需要非 sgen 库。
我是否误解了 libmono 和 libmonsgen 库的使用?
感谢您的任何帮助或指导
这有点棘手,因为 Mono 实际上有两个独立的可执行文件和两个独立的库,每个垃圾收集器一个。例如,如果你运行mono --gc=sgen ...
,mono 实际上会执行一个execvp()
ofmono-sgen ...
来切换到不同的可执行文件。
同样,mkbundle
将用于pkg-config
选择库并链接其中一个(即,以系统默认值为准)。要获取另一个库,有两种选择:
一种是使用 sgen 作为默认值来重建 Mono。显然,这可能不是一个可行的解决方案。
另一种方法是用于pkg-config
覆盖选择。您将创建 的副本mono-2.pc
,替换-lmono-2.0
为-lmonosgen-2.0
,更新prefix
并exec_prefix
使用 PKG_CONFIG_PATH 环境变量来选择该版本。
请注意,我从未真正尝试过后者,但没有理由让它不起作用,因为pkg-config
它是从哪里mkbundle
获取库路径的。
感谢您提出这个问题,因为它可以帮助我确定为什么我的一个应用程序在与 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