Depois de usar o mkbundle2, a máquina de destino não pode encontrar libmono.0.dylib

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

  •  26-09-2019
  •  | 
  •  

Pergunta

Eu tenho um aplicativo de comando .NET muito simples que eu quero portar para o OS X.
Eu posso executá -lo com "Mono App.exe"
No entanto, as máquinas de destino não terão mono instaladas. Então, eu queria agrupar o mono dentro do aplicativo.

Para fazer isso, usei Mkbundle2:

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

Isso funciona sem erros, saída:

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

Eu posso executar isso na máquina de construção. Quando eu executo uma máquina sem mono, no entanto, ela não será executada.

Resultado:

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

o que estou perdendo? Como incluo o tempo de execução do mono?

EDIT: Eu também tentei adicionar a bandeira -estática. Isso dá ao meu aplicativo outra licença, no entanto, o que não tenho certeza se quero. Eu então não reclamo mais de libmono, mas sobre libgthread-2.0.0.dylib

Foi útil?

Solução

Portanto, o problema é que os links do MKBundle para algum arquivo que residem no meu Mac, onde eu esperava que ele os agrupe. Você pode ver claramente que, olhando os recursos vinculados com o comando:

otool -L ./BundledApp

(onde BundleDapp é a saída de mkbundle2)

Para corrigi-lo, acabei usando as tarefas Nant Mkbundle do projeto Monobjc:
http://www.monobjc.net/index.php?page=mkbundle-Task

Eu acho que eles são praticamente uma versão automatizada do que encontrei aqui:
http://code.google.com/p/cocoa-sharp-dev/wiki/redistributableAppwithoutInstallingmono
Mas isso me deu exceções.

A tarefa Monobjc Nant funciona sem problemas e é de longe a solução mais fácil. Eu ainda tenho vários arquivos, mas tudo bem, pelo menos funciona agora.

Outras dicas

Tente correr:

mkbundle -o bundledappname program.exe - -deps

(Use um nome diferente para o pacote e não o mesmo que o seu programa.exe e não coloque a extensão .exe na bandeira -o)

Além disso, você tentou MacPack ?

Para obter mais informações sobre como criar pacotes de leitura aqui e o bom manual de Mkbundle

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top