Linking Libraries in iOS?

2

Questa è probabilmente una domanda totalmente noob ma mi mancano dei link quando penso al collegamento delle librerie in iOS. Di solito aggiungo solo una nuova libreria che è stata compilata in croce e imposta i percorsi di costruzione e linker senza sapere veramente cosa sto facendo. Spero che qualcuno possa aiutarmi a colmare alcune lacune.

Prendiamo ad esempio la libreria OpenCV. Ho completamente funzionante a causa di un tutorial ben scritto ( link ), ma voglio solo sapere cosa sta succedendo esattamente.

Quello che sto pensando sta succedendo è che quando costruisco OpenCV per iOS è il tuo codice oggetto di creazione che viene inserito nei file .a. Questo codice oggetto è solo i file di implementazione (.m) compilati. Una ragione per cui vorresti farlo è rendere difficile vedere il codice sorgente e non dover compilare quel codice sorgente ogni volta.

I file .h non verranno messi nella libreria (.a). Si include il file .h nei file di origine e questi file di intestazione comunicano in qualche modo con la libreria dei codici oggetto (.a).

Devi anche includere i file di intestazione per la tua libreria nel percorso di creazione e la libreria stessa nel percorso del linker.

Quindi, il modo in cui visualizzo le librerie di collegamento è corretto? Se, non può qualcuno correggermi su questo?

    
posta Bob Dole 17.03.2011 - 16:06
fonte

2 risposte

1

Le tue idee sono generalmente corrette, tuttavia mi sembra che tu sia in una sorta di delusione sulla quantità di "magia" che si verifica durante una compilazione:

these header files communicate with the object code library ( .a ) in some way.

La verità è più semplice di questa: non c'è connessione tra le intestazioni e l'archivio della libreria (i file .a sono compressi .o file). L'unica cosa che contiene il file di intestazione è la dichiarazione delle funzioni utilizzate. Questo dice al compilatore che queste funzioni esistono, da qualche parte. Nella fase di compilazione, il compilatore presuppone che lo facciano e crea codice oggetto solo per funzioni definite . Quindi, nella fase di collegamento, il linker cerca le funzioni dichiarate , che non si trovano nel file originale. Ecco perché è necessario # import / # includere l'intestazione appropriata e importare il dylib o aggiungere il file .a.

In effetti, è possibile gestire senza il file di intestazione se si conoscono le dichiarazioni delle funzioni che si intendono utilizzare e dichiararle in cima al file in cui le si sta utilizzando. Ovviamente, questo sarebbe folle, dal momento che stai togliendo molte informazioni dal compilatore e se commetti un errore nella dichiarazione della funzione, produrrebbe un errore di compilazione per non usare correttamente la funzione, o un errore di collegamento per non trovare l'implementazione della funzione (dichiarata in modo errato)

EDIT: ho appena testato il seguente codice:

myfunkyfunction();

in Objective-C ciò genera il classico avviso del compilatore per "dichiarazione implicita di ..." e l'errore del linker "Simbolo (i) non trovato".

Il seguente codice, tuttavia, fallisce con un errore del compilatore "Funkster undeclared".

Funkster* hipster = [[Funkster alloc] init];

Pertanto, mentre è possibile omettere interamente le dichiarazioni delle funzioni C, dichiarare le classi Objective-C è obbligatorio in fase di compilazione.

    
risposta data 03.05.2012 - 14:45
fonte
0

Il modo in cui vedi il processo di collegamento è corretto.

La produzione di una libreria facilita: - protezione del codice sorgente - distribuzione - tempo di compilazione

Il processo che descrivi è esattamente lo stesso per C, C ++

Hai menzionato solo le librerie statiche ma il processo è simile per le librerie dinamiche.

    
risposta data 04.01.2012 - 11:18
fonte

Leggi altre domande sui tag