Использование mkbundle для переноса приложения Mono GTK # на другие платформы - PullRequest
12 голосов
/ 03 июля 2011

Я давний разработчик C #, но плохо знаком с Mono и, особенно, с Gtk #.Я разработал небольшое приложение с использованием C # и Gtk #.Мне нужно, чтобы это приложение работало на Windows, Linux и Mac, поэтому я решил пойти на Mono, и пока, похоже, это крутой фреймворк.

Что мое простое приложение делает, так это запускает веб-сервер XSPна основе локального каталога и порта, выбранного пользователем.В идеале я хотел бы, чтобы мое приложение работало без необходимости сначала устанавливать Mono Framework, но для начала это не must .Я использую следующие библиотеки:

using System; 
using Gtk; 
using System.Net; 
using Mono.WebServer; 
using System.Diagnostics; 

Я занимаюсь разработкой на Mac (Snow Leopard, 10.6.7).Мой исполняемый файл отлично работает на моем Mac.Но у меня проблемы с Ubuntu и Windows.Мое приложение частично работает на Ubuntu (11.04) - оно запускается и, кажется, работает, но не удается, когда я пытаюсь запустить веб-сервер XSP, который выглядит ожидаемым, поскольку Mono.Webserver , вероятно, не установлен на моемUbuntu машина.В Windows (7, 64-разрядная версия) мое приложение сразу падает, когда я дважды щелкаю по нему.Отчет о сбое сообщает мне, что произошла ошибка System.IO.FileNotFoundException .Вероятно, из-за той же недостающей библиотеки XSP?

Во всяком случае, я посмотрел в Интернете и узнал о mkbundle.Я выполнил следующие настройки в соответствии с различными ветками форума:

export AS="as -arch i386"

Я перешел в каталог / bin / Release моего проекта и затем выполнил следующую команду:

mkbundle MivandoLocalServer.exe -o MivandoLocalServer --deps

Но я получаю следующий вывод, который в конечном итоге дает сбой:

Compiling: 
as -arch i386 -o temp.o temp.s 
cc -g -o MivandoLocalServer -Wall temp.c `pkg-config --cflags --libs mono-2`  temp.o 
Package mono-2 was not found in the pkg-config search path. 
Perhaps you should add the directory containing `mono-2.pc' 
to the PKG_CONFIG_PATH environment variable 
No package 'mono-2' found 
temp.c:2:36: error: mono/metadata/assembly.h: No such file or directory 
temp.c:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘assembly_bundle_MivandoLocalServer_exe’ 
temp.c:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token 
temp.c:18: error: ‘NULL’ undeclared here (not in a function) 
temp.c: In function ‘mono_mkbundle_init’: 
temp.c:22: warning: implicit declaration of function ‘mono_register_bundled_assemblies’ 
temp.c:22: error: ‘bundled’ undeclared (first use in this function) 
temp.c:22: error: (Each undeclared identifier is reported only once 
temp.c:22: error: for each function it appears in.) 
temp.c: In function ‘main’: 
temp.c:114: warning: implicit declaration of function ‘mono_set_dirs’ 
[Fail]

Я действительно не знаю, что делать отсюда.У меня установлен MacPorts, и я прочитал, что это может вызвать некоторые проблемы с каталогом pkg-config .Это правда?Если да, что я должен сделать, чтобы это работало?

Я надеюсь, что кто-нибудь сможет мне помочь.Спасибо!

С уважением, Себастьян

PS.Я также разместил этот вопрос на форумах на домашней странице Mono, но пока без ответов.

Обновление: Я подозреваю, что MacPorts вмешивается в мой каталог pkg-config установка.Когда я ввел следующие команды в свой терминал, mkbundle позволил мне скомпилировать.Но я все еще сталкиваюсь с некоторыми проблемами.

export PKG_CONFIG_PATH="/Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig/"
export AS="as -arch i386"
export CC="cc -arch i386"

Выполнение следующей команды mkbundle приводит к Unix-архиву объемом 4,9 МБ, который включает все необходимые зависимости.Когда я дважды щелкаю этот новый файл на моем Mac, появляется окно терминала и запускается мое приложение.Милая!Но это не работает ни в Windows, ни в Ubuntu.

mkbundle MivandoLocalServer.exe -o MivandoLocalServerBundle --deps -z

Я хотел бы получить пакетный исполняемый файл, который можно запустить в Windows и Ubuntu.До сих пор я не нашел решения, позволяющего мне это делать.Я попытался установить MonoDevelop на мой компьютер с Windows 7, скопировать мое решение и собрать его там.Но так как мое приложение зависит от библиотеки Mono.WebServer2, я не могу собрать ее в Windows.Мне не удалось найти Mono.WebServer2.dll для загрузки для Windows нигде в Интернете.

1 Ответ

1 голос
/ 23 сентября 2014

Прежде всего, эта ситуация охватывает две отдельные проблемы, которые я рассмотрю отдельно:

  1. Архитектура - только i386
  2. Сборка и упаковка

1.Архитектура

Прежде всего, не все машины Windows и Linux работают на архитектуре i386, поэтому убедитесь, что вы используете ту, которая есть.Скорее всего, это i386, но Linux может легко работать на многих архитектурах, и Windows недавно тоже пошла по этому пути (они поддерживали его в прошлом, но быстро потеряли поддержку) с новыми типами процессоров для планшетных ПК.

2.Сборка и упаковка

При нацеливании на любую операционную систему обязательно должны быть различия в путях упаковки, поэтому вам следует собираться для каждой целевой ОС с этой целевой ОС.Если вы хотите, чтобы mkbundle работал в Windows, там должен быть установлен весь набор инструментов, а Windows требуется специальный скрипт, чтобы сделать его правильным, но, поскольку mkbundle был создан для Unix-подобных ОС, он должен работать в Linux без особых соображений:1020 * Создать исполняемый файл C # с mkbundle в Windows

http://linux.die.net/man/1/mkbundle

...