2009-03-12 15 views
9

Attualmente sto sviluppando un programma in Qt e utilizza la libreria libqextserialport.1.dylib.Come posso collegare una libreria dinamica in Xcode?

costruisco e corro in x-codice e sputa indietro:

dyld: Library not loaded: libqextserialport.1.dylib 
    Referenced from: /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/QtOpenCV 
    Reason: image not found 

La biblioteca si trova in/Users/samuelreh/Desktop/QtOpenCV/qextserialport/build /.

posso correre il mio programma, modificando la cartella eseguibile /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/ ed entrando:

install_name_tool -change libqextserialport.1.dylib /Users/samuelreh/Desktop/QtOpenCV/qextserialport/build/libqextserialport.1.dylib QtOpenCV

so probabilmente ci sono molte soluzioni oltre a questo. Qualcuno sa il migliore/più elegante/più facile da fare con x-code?

risposta

2

Se ho compreso correttamente il problema, l'app sta funzionando correttamente, nessun errore durante il collegamento, ma quando si tenta di avviarlo non è possibile trovare la libreria.

Questo non è sorprendente, poiché il file dylib si trova in una directory arbitraria non sul percorso di sistema. O è necessario copiarlo in /usr/lib (probabilmente non è una buona idea) o includerlo nel pacchetto dell'applicazione. Quest'ultimo è probabilmente l'approccio migliore.

Non l'ho mai provato, ma a quanto pare è necessario utilizzare uno Copy Files Build Phase per inserire il dylib all'interno del pacchetto e quindi configure Xcode in modo che il file eseguibile saprà dove trovarlo.

+0

e se si crea un eseguibile senza bundle? – John

0

Basta trascinare la libreria dalla directory sul progetto Xcode, meglio nelle risorse ma non importa (credo). Ho provato con e senza il controllo 'copia i file in bundle' e funziona in entrambi i casi, non so se è necessario includerlo in bundle per la distribuzione.

Ho provato questo con sqlite3 e l'applicazione di cacao (cacao-touch).

4

Ho appena fatto esattamente questo, con un progetto Bundle modulo. Questo è stato incluso in un progetto più ampio con un eseguibile separato.

Ho aggiunto un passaggio "Copia dylibs a framework", che ha copiato i dylibs in /Foobar.bundle/Contents/Frameworks/Foobar/. Poi ho aggiunto una fase di script Esegui per eseguire come fase finale, per risolvere i nomi di installazione dei dylibs nel file eseguibile:

install_name_tool -change libBobDylan.dylib @executable_path/../Plugins/Foobar.bundle/Contents/Frameworks/Foobar/libBobDylan.dylib path/to/build/product/Foobar.Bundle/Contents/MacOS/Foobar 

Naturalmente, libBobDylan.dylib anche legata alla libBillyIdol.dylib. Così ho dovuto aggiungere un'altra fase di script Esegui proprio all'inizio del target per risolvere i nomi di installazione qui:

install_name_tool -change libBillyIdol.dylib @executable_path/../Plugins/FooBar.bundle/Contents/Frameworks/Foobar/libBillyIdol.dylib local/path/to/libBobDylan.dylib 

ho avuto più di una dozzina di questi per collegare contro; Ho dovuto convincere il fornitore dei dylibs a tamponare la testata per adattarsi alle mie numerose modifiche install_name ...

Problemi correlati