Использование Mono mkbundle для настройки сборщика мусора SGEN
Можно ли связать исполняемый файл Mono с помощью mkbundle, который использует sgen GC?
Я предполагаю, что, поскольку произведенный пакет требует libmono-2.0.so.1 вместо libmonosgen-2.0.so, он использует стандартный boehm GC. Я попытался использовать $MONO_OPTIONS=- gc=sgen, но полученный пакет все еще требует не-sgen lib.
Я неправильно понимаю использование библиотек libmono и libmonsgen?
Спасибо за любую помощь или руководство
2 ответа
Это немного сложно, потому что Mono на самом деле имеет два отдельных исполняемых файла и две отдельные библиотеки, по одной для каждого сборщика мусора. Например, если вы запустите mono --gc=sgen ...
тогда моно будет на самом деле сделать 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
получает путь к библиотеке от.
Спасибо за этот вопрос, так как он помогает мне определить, почему одно из моих приложений работает слишком медленно после объединения с mkbundle. Это было из-за использования двигателя Boehm GC.
Чтобы включить SGen, вам просто нужно вызвать mkbundle с флагом --keeptemp, а затем переписать команду компилятора (которая печатается 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