Использование 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
Другие вопросы по тегам