Подтвердить что ты не робот

Как сделать опцию "mkbundle --deps", работающую с моно 3.2.3

Я пытаюсь связать приложение с моно 3.2.3 с автономным исполняемым файлом. Для этого я следую этим рекомендациям. После объявления переменных:

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
export CC="i686-pc-mingw32-gcc -U _WIN32"

Команда mkbundle --deps не может локализовать ссылочные сборки:

Unhandled Exception:
System.IO.FileNotFoundException: Could not load file or assembly 'gtk-sharp' or 
one of its dependencies. The system cannot find the file specified.
File name: 'gtk-sharp'

выполняет точно ту же операцию с моно 2.10.9:

mono_version="2.10.9"
export MONO=/cygdrive/c/progra~2/Mono-$mono_version
machineconfig=$PROGRAMFILES\\Mono-$mono_version\\etc\\mono\\4.0\\machine.config
export PATH=$PATH:$MONO/bin
export PKG_CONFIG_PATH=$MONO/lib/pkgconfig
export CC="i686-pc-mingw32-gcc -U _WIN32"

mkbundle --deps --machine-config "$machineconfig" -c UI.exe

дает положительный результат:

OS is: Windows
WARNING:
  Check that the machine.config file you are bundling
  doesn't contain sensitive information specific to this machine.
Sources: 3 Auto-dependencies: True
   embedding: C:\users\piotr\desktop\authoringtool\UI\bin\debug\UI.exe
 config from: C:\users\piotr\desktop\authoringtool\UI\bin\debug\UI.exe.config
   embedding: C:\PROGRA~2\MONO-2~1.9\lib\mono\gac\gtk-sharp\2.12.0.0__35e10195dab3c99f\gtk-sharp.dll
   embedding: C:\PROGRA~2\MONO-2~1.9\lib\mono\gac\glib-sharp\2.12.0.0__35e10195dab3c99f\glib-sharp.dll
   .
   .
   .
   embedding: C:\PROGRA~2\MONO-2~1.9\lib\mono\4.0\Mono.Posix.dll
Machine config from: C:\Program Files (x86)\Mono-2.10.9\etc\mono\4.0\machine.config
Compiling:
as -o temp.o temp.s

Кто-нибудь знает причину такого поведения? Я использую 64-битную версию Windows 7 и Cygwin, которую я нашел на официальном сайте. Код был скомпилирован и протестирован на Xamarin Studio 4.2 и Visual Studio 2010.

4b9b3361

Ответ 1

Howto для mkbundle на cygwin + mingw

Протестировано с помощью моно 4.0.3
В моно 4.0.3 работает mkbundle, но может быть сложно сделать это.
Сначала проверьте настройки:

  • Установите Mono/GTK # в путь, который не содержит пробелов (т.е. не программные файлы)
  • Установите рабочую цепочку компиляции MinGw/Cygwin (как ту, которая для компиляция моно на окнах).
  • Определите обязательные переменные окружения для mkbundle:
    • расположение компилятора mingw должно быть в PATH Windows (используется cmd)
    • pkg-config также должен быть в Windows PATH
  • Используйте следующий cygwin script (его можно настроить для запуска на cmd)
# M_PREFIX refers to Mono installation
# For more information, search for prefix installation in Mono documentation
M_PREFIX='/cygdrive/c/Mono'

export DYLD_FALLBACK_LIBRARY_PATH=${M_PREFIX}/lib:${DYLD_FALLBACK_LIBRARY_PATH}
export LD_LIBRARY_PATH=${M_PREFIX}/lib:${M_PREFIX}/lib/mono/4.5:${LD_LIBRARY_PATH}
export C_INCLUDE_PATH=${M_PREFIX}/include:${C_INCLUDE_PATH}
export ACLOCAL_PATH=${M_PREFIX}/share/aclocal:${ACLOCAL_PATH}
export PKG_CONFIG_PATH=${M_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}
# Here we added the system32 to make cmd available to mkbundle
# /usr/bin is the default location for mingw
export PATH=${M_PREFIX}/bin:/cygdrive/c/Windows/system32:/usr/bin:${PATH}

export CC="i686-pc-mingw32-gcc -U _WIN32"

Затем вы можете запустить:

mkbundle --deps --keeptemp my.exe my.dll -o bundled.exe

Примечания:  - Скопировать mono-2.0.dll в каталог приложения, так как он должен быть распределен по объему exe

cp ${M_PREFIX}/bin/mono-2.0.dll .
  • Если используется -z, файл zlib1.dll также должен быть скопирован. (обратите внимание, что изменение gcc также изменяется). Возможно, вам понадобится больше dll в зависимости от использования функций фреймворка (не исчерпывающий список: libglib *.dll, libgmodule *.dll, libgthread *.dll, iconv.dll, intl.dll)
  • -c используется для создания только заглушки.
  • Вы должны указать все 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

Для консольных приложений

Чтобы сделать работу с консольным приложением, вы должны удалить -mwindows из команды gcc. Для этого вы должны вызвать pkg-config --cflags --libs mono-2 и удалить -mwindows.

После этого вы должны получить что-то подобное:


    i686-pc-mingw32-gcc  -g -o output.exe -Wall temp.c -mms-bitfields -IC:/Mono/include/mono-2.0 -mms-bitfields  -LC:/Mono/lib -lmono-2.0 -lws2_32 -lpsapi -lole32 -lwinmm -loleaut32 -l advapi32 -lversion temp.s

Любой может улучшить mkbundle

mkbundle - это консольное приложение с открытым исходным кодом С# (в моно github). поэтому его можно легко модифицировать и перекомпилировать в зависимости от ваших потребностей. Чтение кода также могло бы помочь понять, как оно работает под ним.
cmd, поскольку различные команды, используемые mkbundle, жестко закодированы, поэтому это может выиграть от некоторого улучшения параметризации.