Невозможно скомпилировать простое приложение на C# с помощью mkbundle
Я написал консольное приложение "Hello world". и следовали за C# Cywgwin моно 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 ответа
Прежде всего, подготовьте среду разработки:
- Установите Mono. Например, вы установили его в "
C:\Soft\Mono
". - Установите Cygwin. При выборе пакетов для установки выберите следующее: gcc-mingw, mingw-zlib, pkg-config, nano.
- Запустите оболочку Cygwin Bash (используя ссылку или
bash --login -i
"команда). - Открыто "
$HOME/.bashrc
"с" нано "("nano ~/.bashrc
"). Не используйте редакторы, которые не сохраняют конец строки ("CR", "LF", "CR/LF"или другие), иначе это повредит файл! Добавьте следующие строки в конец файла:
export PKG_CONFIG_PATH=/cygdrive/c/Soft/Mono/lib/pkgconfig export PATH=$PATH:/cygdrive/c/Soft/Mono/bin
Перезапустите Cygwin Bash.
После этого вы можете скомпилировать ваши сборки с помощью "mkbundle":
- Выполните следующую команду: "
mkbundle -c -o host.c -oo bundle.o --deps YourAssembly.exe <additional arguments>
". Вы также можете при желании пройти"-z
"чтобы сжать результирующий пакет. Вы должны получить файлы" host.c "и" bundle.o ". В "host.c" вы должны удалить "_WIN32" "branch" (кроме "
#include <windows.h>
"один). Это не работает. Вы можете сделать это, просто добавив"#undef _WIN32
"сразу после следующих строк в нем:#ifdef _WIN32 #include <windows.h> #endif
Итак, вы получите:
#ifdef _WIN32 #include <windows.h> #endif #undef _WIN32
Выполните следующую команду: "
gcc -mno-cygwin -o ResultantBundle.exe -Wall host.c
`pkg-config --cflags --libs mono-2|dos2unix`
bundle.o <additional arguments>
Msgstr "Если вы добавили дополнительный аргумент -z на шаге 2, вы должны добавить дополнительный аргумент -lz на этом шаге.- Вы получите "ResultantBundle.exe". Это ваше приложение Mono, упакованное как отдельный исполняемый файл.
- Для этого по-прежнему требуется "mono-2.0.dll" и некоторые дополнительные DLL-файлы и ресурсы, от которых вы зависели во время разработки (например, может потребоваться GTK# native DLL-s), но для работы не требуется полная Mono-среда.
Просто хотел добавить, что если вы передадите -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, чтобы сделать это настолько раздражающим, я был бы заинтересован внести свой вклад.
После того, как у вас есть temp.o и temp.c, вы можете добавить их в Visual C++, чтобы создать приложение для Windows с другими источниками.