2012-02-13 17 views
31

Sto sviluppando un'applicazione Cocoa utilizzando l'ultima versione di Xcode 4, voglio collegare librerie dinamiche al mio progetto (dylibs).Perché install_name_tool e otool sono necessari per le librerie Mach-O in Mac Os X?

Ho letto da qualche parte che aggiungere le librerie nel mio progetto non era sufficiente poiché devo eseguire install_name_tool e otool per far sì che il mio progetto utilizzi le librerie che sono state raggruppate nel mio progetto.

Ho letto le pagine di manuale per install_name_tool, ma non capisco PERCHÉ devo farlo.

Come funzionano le biblioteche? Particolarmente interessati nella parte in cui l'applicazione e le librerie hanno percorsi che puntano a luoghi specifici nella mia macchina, come /usr/local/lib/mylibrary.dylib quando si esegue otool -L

risposta

51

Apple ha diversi modi per localizzare le librerie condivise:

  1. @executable_path: relativi alla l'eseguibile principale
  2. @loader_path: relative al rinvio binario
  3. @rpath: relative a qualsiasi di una lista di percorsi.

@rpath è l'aggiunta più recente, introdotta in OS X 10.5.

Se per esempio si desidera avere il vostro eseguibile in Contents/MacOS e librerie in Contents/Libraries si potrebbe effettuare le seguenti operazioni:

install_name_tool -id @rpath/Libraries/lib_this.dylib builddir/lib_this.dylib 

e l'eseguibile di livello superiore set rpath con:

install_name_tool -add_rpath @loader_path/.. myexecutable 

e:

install_name_tool -change builddir/lib_this.dylib @rpath/Libraries/lib_this.dylib myexecutable 

N Nota: che il primo percorso dopo -change deve corrispondere esattamente a ciò che è attualmente nel file binario.

In caso di smarrimento, otool -l -v myexecutable indicherà quali sono esattamente i comandi di caricamento nell'eseguibile.

Vedere man dyld e man install_name_tool per ulteriori informazioni.

+0

'otool -L' è anche utile per visualizzare i nomi e le librerie condivise (che potreste voler cambiare con' install_name_tool'. – par

+6

Nota: install_name_tool fallisce silenziosamente, controllare sempre che effettivamente abbia fatto ciò che gli avete detto di fare (usando 'otool -L '. – geowar

+0

Sembra che gli attributi in un dylib non contengano molto: sono usati solo quando si collega un eseguibile al dylib per copiare gli attributi dal dylib all'eseguibile. Per Nel caso in cui si abbia già un eseguibile collegato a un dylib ma è necessario modificare i percorsi, è sufficiente modificare solo l'eseguibile per impostare LC_LOAD_DYLIB e, facoltativamente, LC_RPATH. Il secondo è necessario solo se il primo ha @rpath esso. –