2010-05-11 22 views
9

Ho un progetto di applicazione che dipende da un paio di librerie condivise che ho creato personalmente. Secondo la documentazione Qt 4.6 "Distribuzione di un'applicazione su Mac OSX":macdeployqt e librerie di terze parti

Nota: Se si desidera una libreria di 3a parte da includere nella propria applicazione bundle, quindi è necessario aggiungere una voce lib excplicit per quella libreria al file .pro dell'applicazione . Altrimenti, lo strumento macdeployqt non copierà il file .dylib di terze parti nel pacchetto.

Ho aggiunto voci lib al file .pro della mia applicazione ma le librerie che ho scritto non vengono copiate nel pacchetto quando eseguo macdeployqt. Ho il seguente nel mio file .pro:

LIBS += -L../Libraries -lMyLib 

Tutto costruisce bene, i suoi errori proprio quando si tenta di eseguire dal fascio che ho eseguito in problemi vale a dire "l'immagine non trovato".

C'è un errore in macdeployqt o devo aggiungere qualcosa di più al mio file .pro?

risposta

1

Hai controllato il pacchetto .app per vedere se le librerie sono in realtà non ci sono?

Se questo è il caso, presumo che ci sia davvero un bug in macdeployqt, o semplicemente non riesce a trovare la libreria che si sta collegando. Personalmente non ho mai visto che macdeployqt copi nel pacchetto tutte le librerie di terze parti necessarie.

La parte interessante è che macdeployqt non funziona mai direttamente con il file .pro. Fa solo alcune cose per il pacchetto di applicazioni prodotto. E dopo una rapida occhiata nella documentazione di questo Qt 4.7 documentation page ovviamente mi dà ragione:

Nota: Se si desidera una libreria di terze parti da includere nel vostro pacchetto di applicazione, è necessario copiare la libreria nel fascio manualmente, dopo il pacchetto è stato creato.

Suppongo che ci sia un errore nella documentazione 4.6. Per me macdeployqt mai collocato alcun file di libreria nel mio pacchetto (eccetto quelli Qt *, ovviamente).

Ho passato molto tempo con questa roba nel mio passato e ho finito per scrivere un semplice script (Python) che comprime tutto nel mio pacchetto, modifica i nomi delle librerie secondo necessità e inserisce tutto in un file .dmg file con denominazione automatica.

Forse non quello che volevi sentire, ma funziona. ;)

14

badcat è corretto che la documentazione di Qt 4.6 ha una visione notevolmente gonfiata di ciò che è possibile con lo strumento macdeployqt.

Nella mia esperienza, le uniche cose che si fanno da macdeployqt sono:

  1. Copiare le librerie Qt nel tuo pacco app nel foo.app/Contents/Frameworks/directory
  2. Regola le librerie di collegamento di un file binario, ovvero foo.app/Contents/MacOS/foo (deve avere lo stesso nome del pacchetto di app, anche se si menziona un altro binario in Info.plist)

Quindi, per ogni altra libreria di binario e si desidera distribuire nel proprio bundle app, è necessario effettuare le seguenti operazioni:

  1. Run macdeployqt a godere del suo utile, ma debolmente inadeguata benefici

    macdeployqt <path_to_your_nascent_app_bundle>/foo.app

  2. installare il librerie extra manualmente

    cp <original_library_path> foo.app/Contents/Frameworks/<lib_name>

  3. sapere quali librerie ogni link binari a.

    otool -L <binary_file_name>

  4. modificare i percorsi libary interne nei vostri binari

    install_name_tool -change <original_library_path> @executable_path/../Frameworks/<lib_name> <binary_file_name>

ho scritto uno script perl che consente di automatizzare questa procedura per la mia domanda, ma è un po 'troppo specifico per il mio ambiente particolare da pubblicare qui.

+0

+1 per la parte "stesso nome come pacchetto di app". Ho avuto un numero di build incluso nel mio nome .app ma non in binario. Questo sembra risolvere uno dei miei problemi. Grazie. – kolenda

+0

Esegui ancora macdeployqt una volta copiate le librerie mancanti nell'app e install_name_toll eseguito su quelle librerie mancanti – MistyD

+0

@MistyD No. macdeployqt, almeno come ha funzionato quando ho scritto questa risposta, non fa nulla per quelle librerie mancanti. Ecco perché esegui install_name_tool manualmente. –

3

Non è necessario occuparsi della distribuzione manuale di librerie di terze parti. Sto caricando una patch per Qt che permette di specificare ulteriori percorsi di ricerca biblioteca, in modo che lo strumento macdeployqt trova le dipendenze di terze parti: https://codereview.qt-project.org/#change,47906

Dopo questo ci sarà un altro commit che aggiungerà il supporto per il terzo Implementazione di librerie di partito.

+0

Questa sarà una grande aggiunta a macdeployqt. È stato difficile distribuire manualmente librerie/framework di terze parti. –

+0

Ho scaricato questo e ho provato a costruirlo ('qttools.pro', sostituendo la cartella qttools nel mio Qt 5.0.2 con quello di git), ma ho degli errori riguardo a qtNomakeTools e (dopo averlo commentato) 'Il progetto non ha file .qmake.conf di primo livello e 'Versione modulo non specificata'. Puoi aiutarmi a far funzionare la patch? Sono alla fine dei miei tentativi di installare su un Mac. Ho provato Bruns, ma ha portato a un enorme pasticcio di percorsi all'interno di percorsi. –

0

https://github.com/auriamg/macdylibbundler

dylibbundler è un piccolo programmi della riga di comando che mira a rendere .dylibs bundling più semplice possibile. Determina automaticamente quali dylib sono necessari per il tuo programma, copia queste librerie all'interno del pacchetto di app e corregge sia loro che l'eseguibile per essere pronti per la distribuzione ... tutto questo con un singolo comando sul teminal! Funzionerà anche se il tuo programma utilizza plug-in con dipendenze.

Problemi correlati