2010-06-25 14 views
5

He creado una biblioteca estática, para vincularla en mis aplicaciones de iPhone. Esta biblioteca utiliza algunas variables y funciones globales, como en C. Mi problema es que cuando se utiliza por ejemplo:variables externas en la biblioteca estática, utilizando Objective-C

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

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

Cuando utilizo esta función, o acceder a estas variables, en cualquier parte de mi código, el compilador me dice

"_do_stuff" hace referencia a partir de: - [Objeto testMethod] en tests.o

"_a_variable" hace referencia a partir de: - [Objeto testMethod] en tests.o

"_an_array" hace referencia a partir de: - [Objeto testMethod] en tests.o

Símbolo (s) que no se encuentra collect2: Id devolvió el código de salida 1

Alguien ha enfrentado a este problema antes? Sé que estoy haciendo algo estúpido, me falta algún concepto clave de Objective-C o C, pero realmente no puedo ver qué. Así que esperaba que alguien pudiera ayudarme. Gracias por adelantado.

Respuesta

5

Estos son errores de enlazador, que le informan que las entidades a las que se hace referencia no se pueden encontrar. Probablemente esto significa que no ha agregado su biblioteca al proyecto.

Como acotación al margen, probablemente debería distinguir entre el lugar donde se declara estas cosas, en los que de hecho deben ser declarados como extern, y el lugar donde se define ellos, donde no deberían estar. Es decir, es posible que tenga un archivo de cabecera que incluye:

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

Y entonces un archivo de aplicación que tiene algo como:

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

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

Como otro lado, llamar a algo a_variable cuando en realidad es un const es una un poco engañoso!

+0

Intenté con la biblioteca vinculada a la aplicación de destino, luego intenté con la aplicación de destino dependiendo del objetivo de la biblioteca. Ambos producen el mismo error. En cuanto al punto de declaración/definición, en realidad tengo los valores y los cuerpos de función definidos en un archivo .mm. Acabo de dar un ejemplo en aras de la simplicidad. Obviamente, las variables no se denominan a_variable, simplemente no puedo mostrar mi código debido a un contrato sigil. –

+0

@Ricardo OK, eso es un poco extraño. Verifique que la biblioteca ('blah.a') aparezca realmente en la fase" Enlace binario con bibliotecas "del objetivo de su aplicación. También verifique que la biblioteca realmente exporte los símbolos requeridos. Si ambos son verdaderos, entonces estoy perplejo ... – walkytalky

+0

Ahora que lo mencionas, tal vez no está exportando los símbolos que quiero a nivel mundial. Pero, ¿cómo puedo estar seguro de eso? –

0

@walkytalky Bueno, me encontré con nm en la .a filtrada con grep para ver si esos símbolos fueron exportados.

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 

Parece que para cada símbolo hay una copia indefinida?

+0

Desearía poder fingir que sabía lo que esto significa, pero no es así. Parece que el archivo .a puede contener varias tablas de símbolos, ¿tal vez para diferentes arquitecturas? - y el vinculador está buscando los símbolos en algún lugar donde no están definidos. Pero esto está fuera de mi área de conocimiento, así que no me escuchen. ¡Con suerte, alguien que sepa de lo que están hablando llegará pronto! – walkytalky

+0

bien, gracias por su ayuda :) Si no puedo resolver esto en un día más o menos, simplemente recurriré a copiar los encabezados y los archivos de implementación. –

Cuestiones relacionadas