可以使用使用sgen GC的mkbundle来捆绑Mono可执行文件吗?
我假设因为生成的包需要libmono-2.0.so.1而不是libmonosgen-2.0,所以它使用标准的boehm。我已经尝试使用$MONO_OPTIONS=--gc=sgen,但是生成的包仍然需要非sgen库。
我是不是误解了libmono和libmonsgen库的用法?
感谢您的帮助或指导
发布于 2013-06-28 17:23:57
这有点棘手,因为Mono实际上有两个单独的可执行文件和两个单独的库,每个垃圾收集器一个。例如,如果你运行mono --gc=sgen ...,那么mono实际上会执行mono-sgen ...的execvp()来切换到不同的可执行文件。
类似地,mkbundle将使用pkg-config选择库并链接一个或另一个库(即,无论哪个是系统默认值)。要获取另一个库,有两个选项:
一种是使用默认的sgen重新构建Mono。显然,这可能不是一个可行的解决方案。
另一种方法是使用pkg-config覆盖选择。您将创建mono-2.pc的副本,将-lmono-2.0替换为-lmonosgen-2.0,更新prefix和exec_prefix,并使用PKG_CONFIG_PATH环境变量选择该版本。
请注意,我实际上从未尝试过后者,但它没有理由不工作,因为mkbundle是从pkg-config获得库路径的。
发布于 2015-04-12 12:41:52
感谢你的这个问题,因为它帮助我确定为什么我的一个应用程序在与mkbundle捆绑后运行得太慢。这是因为使用了Boehm引擎。
要包含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.ohttps://stackoverflow.com/questions/17355540
复制相似问题