Domanda

Sto creando un'applicazione plug-in (dylib) che dipende da diverse altre librerie. Queste altre librerie sono installati sul mio sistema, ma non sono garantiti per essere installato su sistemi di qualsiasi utente. Quindi ho bisogno di trovare un modo fascio le dipendenze con la mia applicazione.

ho scoperto che posso usare otool per elencare o modificare i percorsi di altri dylibs. Ciò consentirebbe di creare una cartella che impacchetta la mia applicazione plug-in e tutte le dipendenze necessarie.

Tuttavia, questa operazione sembra manualmente come un compito che richiede tempo e muto. Ci sono utility disponibili per automatizzare esso?

O forse sto facendo male e non v'è un approccio migliore e più ovvia per questo problema?

Modifica Ho creato lo script di un che consente di automatizzare la maggior parte il compito.

È stato utile?

Soluzione

Usa percorsi relativi nel vostro dylib utilizzando install_name_tool. In questo modo si possa impostare una volta, ed installare quella directory ovunque senza la necessità di modificare le librerie in fase di installazione.

Si dovrebbe mettere tutte le tue dipendenze dylib in una cartella, quindi utilizzare install_name_tool per impostare la posizione relativa delle altre dylibs è a carico. Supponiamo che il vostro libmyfoo.dylib libreria dipende libbar.dylib:

install_name_tool -change "/Whatever/full/path/libbar.dylib" "@loader_path/libbar.dylib" libmyfoo.dylib

In questo modo, la libreria sarà sempre cercare libbar.dylib nella stessa directory in cui si trova libmyfoo.dylib.

Si potrebbe anche essere necessario eseguire install_name_tool su alcune delle altre dylibs, se essi dipendono gli uni dagli altri.

Attenzione, la documentazione per install_name_tool sottolinea che "per questo strumento per lavorare quando i nomi di installazione o rpaths sono più grandi del binario deve essere costruito con il ld (1) -headerpad_max_install_names opzione"., in modo da essere sicuri di includere l'opzione di riga di comando quando si costruisce -headerpad_max_install_names la libreria.

@loader_path è relativo al binario usato per caricare il dylib, in questo caso il vostro libmyfoo.dylib. Utilizzare @executable_path se si vuole trovare le librerie relative al file eseguibile che ha iniziato la sequenza di caricamento della libreria.

Altri suggerimenti

Per completare la risposta di Christopher, ecco alcuni link a risorse utili:

Macdylibbundler è un po 'pratico strumento che fa esattamente ciò che viene chiesto. Certamente mi ha salvato la vita quando la distribuzione di file binari per OSX.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top