2010-06-25 11 views
5

Ho creato una libreria statica, da collegare nelle app per iPhone. Questa libreria utilizza alcune variabili e funzioni globali, come in C. Il mio problema è, quando si utilizza ad esempio:variabili esterne nella libreria statica, utilizzando Objective-C

extern 
void do_stuff (const int a) 
{ 
    return a*a; 
} 

extern const int a_variable; 
extern const int an_array[DEFINED_VALUE]; 

Quando uso questa funzione, o accedere a queste variabili, ovunque nel mio codice, il compilatore mi dice

"_do_stuff" si fa riferimento da: - [Object testMethod] in tests.o

"_a_variable" si fa riferimento da: - [object testMethod] in tests.o

"_an_array" si fa riferimento da: - [Object testMethod] in tests.o

Simbolo (s) non trovato Collect2: Id restituito stato 1 uscita

Qualcuno ha mai affrontato questo problema prima? So che sto facendo qualcosa di stupido, mi manca qualche concetto chiave di Objective-C o C, ma non riesco davvero a vedere cosa. Quindi speravo che qualcuno potesse aiutarmi. Grazie in anticipo.

risposta

5

Questi sono errori di linker, che indicano che le entità di riferimento non possono essere trovate. Probabilmente questo significa che non hai aggiunto la tua libreria al progetto.

Per inciso, probabilmente si dovrebbe distinguere tra il luogo in cui si dichiara queste cose, dove dovrebbero infatti essere dichiarati extern, e il luogo dove si definire loro, dove non dovrebbero essere. Cioè, si potrebbe avere un file di intestazione che include:

extern void do_stuff (const int a); 
extern const int a_variable; 
extern const int an_array[]; 

E poi un file di implementazione che ha qualcosa come:

void do_stuff (const int a) 
{ 
    return a*a; 
} 

const int a_variable = 42; 
const int an_array[DEFINED_VALUE] = { 1, 2, 3, 4 }; 

Come un altro a parte, chiamando qualcosa a_variable quando in realtà è un const è un un po 'fuorviante!

+0

Ho provato con la libreria collegata all'app di destinazione, quindi ho provato con l'app di destinazione in base al target della libreria. Entrambi producono lo stesso errore. Per quanto riguarda il punto di dichiarazione/definizione, in realtà ho i valori e i corpi delle funzioni definiti in un file .mm, ho appena dato un esempio per motivi di semplicità. Ovviamente le variabili non sono nominate a_variabile, non posso mostrare alcun codice a causa di un contratto sigillo. –

+0

@ Ricardo OK, è un po 'strano. Verifica che la libreria ('blah.a') sia effettivamente visualizzata nella fase" Collega le librerie con le librerie "del target dell'app. Verificare inoltre che la libreria esporti effettivamente i simboli richiesti. Se entrambi sono veri, allora sono perplesso ... – walkytalky

+0

Ora che ne parli, forse non sta esportando i simboli che voglio globalmente. Ma come posso esserne sicuro? –

0

@walkytalky Bene, ho eseguito nm sul file .a filtrato con grep per vedere se quei simboli sono stati esportati.

host-006:Release-iphonesimulator <username>$ nm -g libCardLib.a | grep CP_ 
nm: no name list 
    U _CP_BACK 
    U _CP_FILE_EXTENSION_SUFFIX 
    U _CP_FILE_PATH 
    U _CP_SUIT_PREFIX 
    U _CP_VALUE_PREFIX 
00002020 D _CP_BACK 
00002018 D _CP_FILE_EXTENSION_SUFFIX 
0000201c D _CP_FILE_PATH 
00002024 D _CP_FRONT 
00002108 D _CP_SUIT_PREFIX 
0000210c D _CP_VALUE_PREFIX 
nm: no name list 
nm: no name list 
nm: no name list 

così sembra che per ogni simbolo c'è una copia non definita?

+0

Vorrei poter fingere di sapere cosa significa, ma non lo so. Sembra che il file .a possa contenere più tabelle di simboli, forse per architetture diverse? - e il linker sta cercando i simboli da qualche parte dove non sono definiti. Ma questo è fuori dalla mia area di conoscenza, quindi non ascoltarmi. Speriamo che qualcuno che sa di cosa stanno parlando sarà presto! – walkytalky

+0

ok, grazie per il tuo aiuto però :) Se non riesco a risolverlo in un giorno o giù di lì, mi limiterò semplicemente a copiare le intestazioni e i file di implementazione. –

Problemi correlati