Не могу скомпилировать простое приложение C# с Mkbundle

StackOverflow https://stackoverflow.com/questions/4474613

  •  11-10-2019
  •  | 
  •  

Вопрос

Я написал немного консоли «Привет, мир». и последовали 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.

Это было полезно?

Решение

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

  1. Установить моно. Например, вы установили его в "C:\Soft\Mono".
  2. Установите Cygwin. При выборе того, какие пакеты для установки выберите следующие: GCC-Mingw, Mingw-Zlib, Pkg-config, Nano.
  3. Запустить Cygwin Bash Shell (либо используя ссылку, либо "bash --login -i"Команда).
  4. Открытым "$HOME/.bashrc"С" Нано "("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 Shell.

После этого вы можете скомпилировать свои сборки с «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>"Один). Это не работает. Вы можете сделать это, просто добавив"#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. Вы получите "recordantbundle.exe". Это ваше моно приложение, упакованное как автономный исполняемый файл.
  5. Это по-прежнему требует «mono-2,0.dll», а также некоторые дополнительные DLL-S и ресурсы, от которых вы зависели во время разработки (например, это может потребовать GTK# Native DLL-S), но для работы не требуется полное время выполнения моно.

Другие советы

Просто хотел добавить это, если вы передаете -Z в Mkbundle, вам нужно перенести -lz в GCC. У меня были некоторые проблемы с получением приложения с Winforms и чистым доступом к работе должным образом, и мне пришлось скопировать машину. Config из C: mono etc mono 4.0 machine.config туда, где находилось мое приложение. Затем я прошел-Machine-Config Machine.config to mkbundle.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top