dopo aver usato mkbundle2, macchina di destinazione non riesce a trovare libmono.0.dylib
Domanda
Ho un'applicazione molto semplice riga di comando NET che voglio porta per OS X.
Posso eseguirlo con "mono app.exe"
Tuttavia, le macchine di destinazione non avranno mono installato.
Così, ho voluto riunire mono dentro l'applicazione.
Per fare questo, ho usato mkbundle2:
mkbundle2 -o bundledapp.exe app.exe --deps
Questo funziona senza errori, in uscita:
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
posso eseguire questo sul sistema di compilazione. Quando mi girano su una macchina senza mono tuttavia, non verrà eseguito.
Output:
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
Che cosa mi manca? Come faccio a includere l'attuale mono runtime?
EDIT: Ho anche provato ad aggiungere il flag --static. Che dà la mia app un'altra licenza però, che io non sono sicuro di volerlo. Ho poi non si lamenta libmono, ma di libgthread-2.0.0.dylib
Soluzione
Quindi, il problema è che i collegamenti mkbundle a qualche file che risiedono sul mio Mac, dove mi aspettavo che per impacchettare loro. Si può chiaramente vedere che, cercando le risorse collegate con il comando:
otool -L ./BundledApp
(dove bundledApp è l'uscita del mkbundle2)
Al fine di risolvere il problema, ho finito per usare le Nant-compiti mkbundle dal progetto monobjc:
http://www.monobjc.net/index.php?page=mkbundle- compito
Penso che siano più o meno una versione automatizzata di quello che ho trovato qui:
http://code.google.com/p/cocoa-sharp- dev / wiki / RedistributableAppWithoutInstallingMono
Ma che mi ha dato le eccezioni.
Il compito Nant Monobjc funziona senza problemi, ed è di gran lunga la soluzione più semplice. Ho ancora più file ma va bene così, almeno funziona ora.
Altri suggerimenti
Provare a eseguire:
mkbundle -o bundledappname program.exe --deps
(utilizzare un nome diverso per il pacchetto, piuttosto che lo stesso del vostro program.exe e non mettere estensione .exe alla bandiera -o)
Inoltre, hai provato macpack ?
Per ulteriori informazioni su come creare fasci di leggere qui e la fine manuale di mkbundle