2010-06-25 6 views
5

J'ai construit une bibliothèque statique, à être liée dans mes applications iPhone. Cette bibliothèque utilise certaines variables et fonctions globales, comme dans C. Mon problème est, lorsque vous utilisez par exemple:variables externes dans la bibliothèque statique, en utilisant Objective-C

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

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

Lorsque j'utilise cette fonction, ou accéder à ces variables, partout dans mon code, le compilateur me dit

"_do_stuff" référencé à partir de: - [objet testMethod] dans tests.o

"_a_variable" référencé à partir de: - [objet testMethod] dans tests.o

"_an_array" référencé à partir de: - [objet testMethod] dans tests.o

Symbole (s) non trouvé collect2: Id retourné 1 état de sortie

Quelqu'un at-il jamais fait face à ce problème avant? Je sais que je fais quelque chose de stupide, il me manque un concept clé en Objective-C ou C, mais je ne vois pas vraiment quoi. Donc j'espérais que quelqu'un pourrait m'aider. Merci d'avance.

Répondre

5

Ce sont des erreurs de liens, vous indiquant que les entités référencées sont introuvables. Cela signifie probablement que vous n'avez pas ajouté votre bibliothèque au projet.

En aparté, vous devriez probablement établir une distinction entre l'endroit où vous déclariez ces choses, où ils devraient en effet être déclarée comme extern, et l'endroit où vous définissez les , où ils ne devraient pas être. Autrement dit, vous pourriez avoir un fichier d'en-tête qui comprend:

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

Et puis un fichier de mise en œuvre qui a quelque chose comme:

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

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

Comme autre côté, appeler quelque chose a_variable quand il est en fait un const est un peu trompeur!

+0

J'ai essayé avec la bibliothèque liée à l'application cible, puis essayé avec l'application cible en fonction de la cible de la bibliothèque. Les deux produisent la même erreur. En ce qui concerne le point declare/define, j'ai en fait les valeurs et les corps de fonctions définis dans un fichier .mm, je viens de donner un exemple par souci de simplicité. Évidemment, les variables ne sont pas nommées a_variable, je ne peux simplement pas afficher mon code en raison d'un contrat sigil. –

+0

@ Ricardo OK, c'est un peu bizarre. Vérifiez que la bibliothèque ('blah.a') apparaît réellement dans la phase" Link Binary With Libraries "de la cible de votre application. Vérifiez également que la bibliothèque exporte réellement les symboles requis. Si les deux sont vraies alors je suis perplexe ... – walkytalky

+0

Maintenant que vous le dites, peut-être qu'il n'exporte pas les symboles que je veux globalement. Mais comment puis-je être sûr de cela? –

0

@walkytalky Eh bien j'ai couru nm sur le .a filtré avec grep pour voir si ces symboles ont été exportés.

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 

Donc il semble que pour chaque symbole il y ait une copie non définie?

+0

J'aimerais pouvoir prétendre que je savais ce que cela signifie, mais je ne le sais pas. Il semble que le fichier .a puisse contenir plusieurs tables de symboles - peut-être pour différentes architectures? - et l'éditeur de liens recherche les symboles quelque part où ils ne sont pas définis. Mais c'est en dehors de mon domaine de connaissance, alors ne m'écoute pas. Espérons que quelqu'un qui sait de quoi ils parlent sera bientôt là! – walkytalky

+0

ok, merci pour votre aide si :) Si je ne peux pas résoudre cela dans un jour ou deux, je vais simplement recourir à la copie des en-têtes et des fichiers d'implémentation. –

Questions connexes