Создать исполняемый файл C# с mkbundle на окнах
Я пытаюсь создать исполняемый файл из консольного приложения. Я установил mono,cygwin (mingw-gcc, mingw-zlib1, mingw-zlib-devel, pkg-config) и добавил следующие строки в мой файл.bashrc
export PKG_CONFIG_PATH=/cygdrive/c/progra~1/Mono-3.2.3/lib/pkgconfig
export PATH=$PATH:/cygdrive/c/progra~1/Mono-3.2.3/bin
export CC="i686-pc-mingw32-gcc -U _WIN32"
Но каждый раз, когда я пытаюсь использовать mkbundle, я получаю следующее сообщение
Есть ли способ заставить mkbundle правильно работать на windows.?
(Я использую windows 7 x86, mono 3.2.3, cygwin, который я нашел на официальном сайте, xamarin studio 4.2 и net framwork 4)
3 ответа
Эта проблема все еще представлена в текущей моно версии под Windows. Это произошло из-за того, что моно команда переключила GC по умолчанию на SGEN. Поэтому, когда вы пытаетесь использовать mkbundle, как вы видите в своей ошибке, утилита mkbundle пытается найти библиотеку mono-2, но эта библиотека не была включена в установку, и у вас произошел сбой. Чтобы решить эту проблему, вы должны настроить mkbundle на использование libmonosgen-2.0 вместо mono-2. Давайте попробуем сделать это.
Ключевым моментом является установка этой переменной:
export PKG_CONFIG_PATH=/cygdrive/c/progra~1/Mono-3.2.3/lib/pkgconfig
Если вы зайдете в этот каталог, вы увидите много файлов *.pc (конфигурация пакета). Эти файлы отвечают за настройку компоновки библиотек в процессе компоновки. По некоторым причинам моно-команда жестко запрограммировала файл конфигурации пакета и библиотеку для моно-2 (см. Эту строку 492). Как мы можем это исправить, не перестраивая mkbundle? Решение состоит в том, чтобы использовать следующий пакетный скрипт:
# Mono paths
mono_version="3.2.3"
export MONO=/cygdrive/c/progra~2/Mono-$mono_version
machineconfig=$PROGRAMFILES\\Mono-$mono_version\\etc\\mono\\4.5\\machine.config
export PATH=$PATH:$MONO/bin
export PKG_CONFIG_PATH=$MONO/lib/pkgconfig
# Compiller
export CC="i686-pc-mingw32-gcc -U _WIN32"
# Output file name
output_name=Prog.exe
# Produce stub only, do not compile
mkbundle --deps --machine-config "$machineconfig" -c Program.exe
# Produce helper object file. You may see errors at this step but it's a side effect of this method.
mkbundle --deps --machine-config "$machineconfig" -oo temp.o Program.exe
# Compile. Pay attention where I use monosgen-2
i686-pc-mingw32-gcc -U _WIN32 -g -o "$output_name" -Wall temp.c `pkg-config --cflags --libs monosgen-2` temp.o
# Copy libmonosgen-2.dll
cp $MONO/bin/libmonosgen-2.0.dll .
# Run
./$output_name
У меня была такая же проблема некоторое время назад и я сделал скрипт для cygwin. Вы можете попробовать это, было бы интересно, если это все еще работает:
В скрипте есть объяснения, как настроить среду.
Howto для mkbundle на Cygwin + Mingw
Здесь вы можете найти обновленную информацию о том, как заставить mkbundle работать на Windows
Сначала проверьте ваши настройки:
- Установите Mono/GTK# по пути, который не содержит пробелов (то есть, не Program Files)
- Установите рабочую цепочку компиляции MinGw/Cygwin (как для компиляции моно в Windows).
- Определите обязательные переменные среды для mkbundle:
- Расположение компилятора mingw должно быть в Windows PATH (используется cmd)
- pkg-config также должен быть в Windows PATH
- Используйте скрипт cygwin для определения моно и mingw обязательных переменных.
Тогда вы можете запустить:
mkbundle --deps --keeptemp my.exe my.dll -o bundled.exe
Заметки:
копия
mono-2.0.dll
в каталоге приложения, как это должно быть распространено вдоль прилагаемого exeВы должны указатьвсе EXE и DLL, которые необходимы для комплекта.
--keeptemp
сохранит temp.c и temp.s, которые могут пригодиться, если mkbundle потерпит неудачу при вызове gcc.- Если вы хотите вызвать gcc вручную (и это может понадобиться):
i686-pc-mingw32-gcc -U _WIN32 -g -o output.exe -Wall temp.c $(pkg-config --cflags --libs mono-2) temp.o
Любой может улучшить mkbundle
mkbundle - это консольное приложение с открытым исходным кодом на C# ( на mono github), поэтому его можно легко модифицировать и перекомпилировать в зависимости от ваших потребностей. Чтение кода также может помочь понять, как он работает.