2013-06-28 7 views
1

Можно ли связать исполняемый файл Mono с помощью mkbundle, который использует sgen GC?Использование Mono mkbundle для целевого сборщика мусора SGEN

Я предполагаю, что из-за того, что для выпускаемого пакета требуется libmono-2.0.so.1 вместо libmonosgen-2.0.so, он использует стандартный BS GC. Я попытался использовать $ MONO_OPTIONS = - gc = sgen, но в результирующем пакете все еще требуется не-sgen lib.

Я не понимаю, как использовать libmono и libmonsgen libs?

Спасибо за любую помощь или руководство

ответ

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 получает путь от библиотеки.

+0

Спасибо за ответ. Вы помогли мне понять, что mono-2.pc - это файл, который указывает, что нужно связывать для создания исполняемого файла. Интересно, что уже есть файл monosgen-2.pc, расположенный в каталоге lib/pkgconfig. Это заставляет меня думать, что должен быть способ переопределить использование mono-2.pc с помощью командной строки или переменной среды. Я попытался изменить PKG_CONFIG_PATH, чтобы фактически включить файл, но он не был успешным. – drg

+0

Если вы посмотрите на источник 'mkbundle.cs', вы увидите, что« mono-2.pc »жестко запрограммирован, к сожалению. Однако после тестирования прямо сейчас, это сработало для меня в том, что тестируемая программа была связана с libmonosgen-2.0.0.dylib (на Mac, используя Mono 3.0.10), и она успешно работала. Обратите внимание, что 'PKG_CONFIG_PATH' должен указывать на каталог, содержащий файл, а не на сам файл. –

+0

В приведенном выше ответе вы говорите: «Один из них заключается в том, чтобы перестроить, когда sgen стал стандартным» ... Это означает, что нужно перестроить моно или перестроить приложение. Я предполагаю, что вы имеете в виду перестроить моно, поскольку я не могу найти какую-либо информацию о том, как указать его на mcs. Благодарим вас за то, что вы смотрите на код. К сожалению, из тяжелой базы MS и Visual Studio ... это даже не произошло. Это должно быть :). – drg

0

Спасибо за этот вопрос, так как он помогает мне определить, почему одно из моих приложений работает слишком медленно после связывания с 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