после использования mkbundle2 конечный компьютер не может найти libmono.0.dylib - PullRequest
1 голос
/ 05 августа 2010

У меня есть очень простое приложение командной строки .NET, которое я хочу портировать на OS X.
Я могу запустить его с помощью "mono app.exe"
Однако на компьютерах назначения не будет установлен mono.Итак, я хотел связать моно внутри приложения.

Для этого я использовал mkbundle2:

mkbundle2 -o bundledapp.exe app.exe --deps

Это работает без ошибок, вывод:

OS is: Darwin
Sources: 1 Auto-dependencies: True
  embedding: /Users/kclement/Projects/app/build/app.exe
  embedding: /Library/Frameworks/Mono.framework/Versions/2.6.1/lib/mono/2.0/mscorlib.dll
  embedding: /Library/Frameworks/Mono.framework/Versions/2.6.1/lib/mono/gac/System/2.0.0.0__b77a5c561934e089/System.dll
  embedding: /Library/Frameworks/Mono.framework/Versions/2.6.1/lib/mono/gac/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
  embedding: /Library/Frameworks/Mono.framework/Versions/2.6.1/lib/mono/gac/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
  embedding: /Library/Frameworks/Mono.framework/Versions/2.6.1/lib/mono/gac/System.Security/2.0.0.0__b03f5f7f11d50a3a/System.Security.dll
  embedding: /Library/Frameworks/Mono.framework/Versions/2.6.1/lib/mono/gac/Mono.Security/2.0.0.0__0738eb9f132ed756/Mono.Security.dll
Compiling:
as -arch i386 -o temp.o temp.s 
cc -g -o bundledapp.exe -Wall temp.c `pkg-config --cflags --libs mono`  temp.o
Done

Я могу выполнить это на сборочной машине.Однако, когда я выполняю на машине без моно, она не запускается.

Вывод:

dyld: Library not loaded: /Library/Frameworks/Mono.framework/Versions/2.6.1/lib/libmono.0.dylib
  Referenced from: /Users/kristof/./bundledapp.exe
  Reason: image not found
Trace/BPT trap

Чего мне не хватает?Как включить фактическую моно-среду выполнения?

РЕДАКТИРОВАТЬ: Я также попытался добавить флаг --static.Это дает моему приложению еще одну лицензию, которую я не уверен, что хочу.Я тогда больше не жалуюсь на libmono, а на libgthread-2.0.0.dylib

Ответы [ 2 ]

1 голос
/ 09 августа 2010

Итак, проблема в том, что mkbundle ссылается на какой-то файл, который находится на моем Mac, где я ожидал, что он объединит их. Это можно ясно увидеть, просмотрев связанные ресурсы с помощью команды:

otool -L ./BundledApp

(где bundledApp - это вывод mkbundle2)

Чтобы это исправить, я использовал mkbundle nant-tasks из проекта monobjc:
http://www.monobjc.net/index.php?page=mkbundle-task

Я думаю, что это в значительной степени автоматизированная версия того, что я нашел здесь:
http://code.google.com/p/cocoa-sharp-dev/wiki/RedistributableAppWithoutInstallingMono
Но это дало мне исключения.

Задача Monobjc nant работает без проблем и, безусловно, является самым простым решением. У меня все еще есть несколько файлов, но это нормально, по крайней мере, теперь это работает.

0 голосов
/ 05 августа 2010

Попробуйте запустить:

mkbundle -o bundledappname program.exe --deps

(используйте другое имя для пакета, а не то же, что и ваша программа.exe и не ставьте расширение .exe к флагу -o)

Кроме того, вы пробовали macpack ?

Для получения дополнительной информации о том, как создавать пакеты, прочитайте здесь и прекрасное руководство по mkbundle

...