2011-02-04 15 views
5

Attualmente sto avendo alcuni problemi di linker quando provo a compilare un programma Objective-C e penso che il motivo per cui non riesco a capire il problema potrebbe essere dovuto all'ignoranza per quanto riguarda il processo del compilatore.Qual è il processo eseguito durante la compilazione Objective-C

Qualcuno potrebbe darmi una panoramica dei passaggi effettuati durante la compilazione?

Questo è come io attualmente comprendo il processo:.

  1. le copie del compilatore i contenuti dei file inclusi nel file .h che è stato definito in Il compilatore non tenere traccia di se una. Il file h è già stato incluso, quindi potrebbe essere incluso più volte in un progetto.

  2. Tutti i file .m sono compilati in codice equivalente C (che vengono a loro volta compilati in codice oggetto).

  3. Il linker produce collegamenti tra le dichiarazioni effettuate nei file .h e le funzioni appropriate all'interno del codice oggetto. Le funzioni appropriate sono determinate cercandole in un file .m con lo stesso nome.

  4. I file oggetto sono collegati insieme per formare l'eseguibile, assicurandosi che la funzione principale si trovi nel punto di ingresso dell'eseguibile. Eventuali dichiarazioni sono quindi presumibilmente cancellate per risparmiare spazio?

Supponendo che questo è corretto (che potrebbe non essere), questo sarebbe probabilmente significa che non si dovrebbe mai # include file .m perché probabilmente finire con molteplici definizioni dei metodi che causano i problemi di linker.

Grazie per qualsiasi illuminazione chiunque può portare a questo :).

Cheers,

Danny

risposta

3

si ottiene l'idea più o meno correttamente. Un paio di correzioni:

  1. #include non verifica se è già incluso o no, ma #import fa controllo.

  2. .m non viene prima convertito in C e quindi nel codice oggetto. È stato fatto in quel modo 20 anni fa, ma non è più così. Viene semplicemente compilato direttamente sul codice oggetto.

  3. Al linker non interessa il nome del file. È possibile utilizzare diversi nomi di file per .h e .m. È possibile dividere le implementazioni di funzioni dichiarate in un file .h in più file .m, ad esempio.

  4. Se le implementazioni inutilizzate vengono eliminate o meno dipende dal compilatore e dalle opzioni del compilatore.

In ogni caso, la tua conclusione è corretta: non devi mai includere/importare un file di implementazione in un altro file di implementazione. Si verificherà un errore di doppia implementazione.

+0

Ah ah, è fantastico; ora è molto più chiaro e ho risolto il problema con il linker! Grazie molto! :) – Danny

Problemi correlati