Vorrei distribuire un .dylib su OSX, che è stato creato con Delphi. Questo .dylib dovrebbe essere caricabile da applicazioni di terze parti.Distribuzione affidabile di Dylib generato da Delphi su OSX
Questa sembra una domanda doppia, ma dopo molte ricerche, non riesco a trovare una risposta. E 'lo stesso problema come questo: https://forums.embarcadero.com/thread.jspa?messageID=592417
Il problema è che il .dylib richiede libcgunwind.1.0.dylib
, ma che non riesce a trovare lo quando viene eseguito da un'applicazione di terze parti. Come prova, ho provato a copiare libcgunwind.1.0.dylib
in usr/lib
e questo ha funzionato. Quando OSX non riesce a individuare il .dylib, cercherà sempre in usr/lib
. Sfortunatamente, non voglio farlo come soluzione finale, perché richiederebbe autorizzazioni elevate e sembra un modo pesante per affrontare un problema semplice.
Ispezione un po 'più da vicino, ho usato otool
di ispezionare la mia .dylib, e mi ha dato il seguente percorso: @rpath/libcgunwind.1.0.dylib
.
Il problema è che non è possibile stabilire quali percorsi verranno elencati in @rpath
, quando il tuo .dylib viene eseguito da un'applicazione di terze parti. Perché ciò funzioni, l'applicazione dovrebbe sempre fornire un percorso assoluto a libcgunwind.1.0.dylib
.
La soluzione ovvia è utilizzare install_name_tool
per sostituire @rpath
con @loader_path
. Se la mia logica è corretta, questo dovrebbe far sì che il mio .dylib trovi sempre libcgunwind.1.0.dylib
, purché si trovino nella stessa cartella. Questo ha senso, dal momento che il .dylib dovrebbe essere incaricato di trovare le proprie dipendenze.
Così, ho provato la seguente riga di comando:
install_name_tool -change @rpath/libcgunwind.1.0.dylib @loader_path/libcgunwind.1.0.dylib libTest.dylib
e ha ricevuto questo messaggio:
install_name_tool: file not in an order that can be processed (local relocation entries out of place): libTest.dylib
Ho fatto qualche ricerca in giro per questo messaggio di errore, e mi rifugio' Sono stato in grado di trovare qualsiasi informazione su di esso. Devo supporre che lo install_name_tool
si aspetti alcune convenzioni specifiche trovate in gcc o llvm .dylib, e che il compilatore di Delphi non stia fornendo tali convenzioni.
Ho fatto un po 'di ricerche nel compilatore di Delphi dccosx
e ho controllato gli argomenti della riga di comando che Delphi sta inviando, ma non riesco a trovare nessuna opzione utile. Questo modo di utilizzare libcgunwind.1.0.dylib
sembra essere implicito nel compilatore e non qualcosa che posso regolare.
Non sto suggerendo che questo sia il modo giusto per affrontare il problema, queste sono solo le ultime cose che ho provato. Se riesci a trovare un modo diverso di risolvere il problema, condividi le tue idee!
Soluzione interessante. Terrò la taglia in caso qualcuno tiri fuori qualcosa di meno coinvolto, ma temo che questa potrebbe essere l'unica soluzione là fuori. Suppongo che non sarebbe così male, se potessi trovare un modo per automatizzarlo nel processo di distribuzione. – AudioGL
Bene, ho provato la patch e questo ha funzionato. Sto ancora in balia al pensiero di farlo ripetutamente. Qual è il tuo processo per la distribuzione di un'applicazione? Realizzi strumenti per il patching? – AudioGL
Ho un evento post build nei miei progetti OSX: '" D: \ Dev \ OSXPatcher.exe "" $ (OUTPUTPATH) "'. Quindi il patching avviene automaticamente. –