Невозможно скомпилировать простое приложение на C # с помощью mkbundle - PullRequest
7 голосов
/ 17 декабря 2010

Я написал консольное приложение в стиле "Hello world".и следовали c # cywgwin mono mkbundle windows 7 - не может скомпилировать файл ответНо у меня есть:

$ mkbundle -o Fur Furries.exe --deps -z
OS is: Windows
Sources: 1 Auto-dependencies: True
  embedding: C:\Monotest\Furries.exe
  compression ratio: 40.43%
  embedding: C:\Soft\Mono\lib\mono\4.0\mscorlib.dll
  compression ratio: 34.68%
Compiling:
as -o temp.o temp.s
gcc -mno-cygwin -g -o Fur -Wall temp.c `pkg-config --cflags --libs mono-2|dos2un
ix` -lz temp.o
temp.c: In function `main':
temp.c:173: warning: implicit declaration of function `g_utf16_to_utf8'
temp.c:173: warning: assignment makes pointer from integer without a cast
temp.c:188: warning: assignment makes pointer from integer without a cast
/tmp/ccQwnxrF.o: In function `main':
/cygdrive/c/Monotest/temp.c:173: undefined reference to `_g_utf16_to_utf8'
/cygdrive/c/Monotest/temp.c:188: undefined reference to `_g_utf16_to_utf8'
collect2: ld returned 1 exit status
[Fail]

Это в Windows XP.

Ответы [ 3 ]

13 голосов
/ 18 декабря 2010

Прежде всего, подготовьте среду разработки:

  1. Установите Mono.Например, вы установили его в "C:\Soft\Mono".
  2. Установите Cygwin.При выборе пакетов для установки выберите следующее: gcc-mingw, mingw-zlib, pkg-config, nano.
  3. Запустите оболочку Cygwin Bash (используя ссылку или команду "bash --login -i").
  4. Открыть "$HOME/.bashrc" с помощью "nano" ("nano ~/.bashrc").Не используйте редакторы, которые не сохраняют конец строки («CR», «LF», «CR / LF» или другие), иначе это повредит файл!
  5. Добавьте следующие строки в конец файла:

    export PKG_CONFIG_PATH=/cygdrive/c/Soft/Mono/lib/pkgconfig
    export PATH=$PATH:/cygdrive/c/Soft/Mono/bin
    
  6. Перезапустите оболочку Cygwin Bash.

После этого вы можете скомпилировать свои сборкис "mkbundle":

  1. Выполните следующую команду: "mkbundle -c -o host.c -oo bundle.o --deps YourAssembly.exe <additional arguments>".Вы также можете при желании передать «-z» для сжатия результирующего пакета.Вы должны получить файлы "host.c" и "bundle.o".
  2. В "host.c" вы должны удалить "_WIN32" "branch" (кроме "#include <windows.h>" one).Не работаетВы можете сделать это, просто добавив «#undef _WIN32» сразу после следующих строк:

    #ifdef _WIN32
    #include <windows.h>
    #endif
    

    Итак, вы получите:

    #ifdef _WIN32
    #include <windows.h>
    #endif
    #undef _WIN32
    
  3. Выполнитьследующая команда: "gcc -mno-cygwin -o ResultantBundle.exe -Wall host.c `pkg-config --cflags --libs mono-2|dos2unix` bundle.o <additional arguments>".Если вы добавили дополнительный аргумент -z на шаге 2, вы должны добавить на этом шаге дополнительный аргумент -lz.

  4. Вы получите «ResultantBundle.exe».Это ваше приложение Mono, упакованное как автономный исполняемый файл.
  5. Для него по-прежнему требуется "mono-2.0.dll" и некоторые дополнительные DLL-файлы и ресурсы, от которых вы зависели во время разработки (например, для него может потребоваться GTK # native DLL)-s) но для запуска не требуется полная Mono-среда.
1 голос
/ 06 сентября 2011

Просто хотел добавить, что если вы передадите -z в mkbundle, то вам нужно будет передать -lz в gcc. У меня были некоторые проблемы с получением приложения с winforms и сетевым доступом для правильной работы, и мне пришлось скопировать machine.config из C: \ Mono \ etc \ mono \ 4.0 \ machine.config туда, где было мое приложение. Затем я передал --machine-config machine.config в mkbundle.

Все эти шаги довольно запутанные и разочаровывающие, почему не так просто, как просто набрать mkbundle --deps app.exe? Я попытался внести изменения в шаблон, используемый mkbundle, и скомпилировать его сам, но он не запустится. Сейчас я зашел так далеко, что скачал моноисточник и попытался собрать все это, но сомневаюсь, что это сработает. Если кто-нибудь может объяснить, что, черт возьми, происходит с mkbundle, чтобы сделать это настолько раздражающим, я был бы заинтересован внести свой вклад.

0 голосов
/ 23 января 2015

после того, как у вас есть temp.o и temp.c, вы можете добавить их в Visual C ++ для создания приложения Windows с другими источниками.

...