внешние переменные в статической библиотеке, используя Objective-C - PullRequest
5 голосов
/ 25 июня 2010

Я создал статическую библиотеку, которая будет связана в моих приложениях для iPhone. Эта библиотека использует некоторые глобальные переменные и функции, как в C. Моя проблема, например, при использовании:

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

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

Когда я использую эту функцию или обращаюсь к этим переменным в любом месте моего кода, компилятор сообщает мне

"_ do_stuff" ссылка с: - [Объект testMethod] в tests.o

"_ a_variable" ссылка с: - [Объект testMethod] в tests.o

"_ an_array" ссылка из: - [Объект testMethod] в tests.o

Символ (ы) не найдены Collect2: Id вернул 1 статус выхода

Кто-нибудь когда-нибудь сталкивался с этой проблемой раньше? Я знаю, что делаю глупости, мне не хватает какой-то ключевой концепции Objective-C или C, но я не могу понять, что именно Так что я надеялся, что кто-нибудь сможет мне помочь. Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 25 июня 2010

Это ошибки компоновщика, говорящие о том, что указанные объекты не могут быть найдены.Возможно, это означает, что вы не добавили свою библиотеку в проект.

В качестве отступления, вы, вероятно, должны различать место, где вы объявляете эти вещи, где они действительно должны быть объявленыкак extern и место, где вы определяете их, где они не должны быть.Таким образом, у вас может быть заголовочный файл, который включает в себя:

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

А затем файл реализации, который имеет что-то вроде:

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

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

В качестве еще одного случая, вызывая что-то a_variable, когдаэто на самом деле const немного вводит в заблуждение!

0 голосов
/ 25 июня 2010

@ walkytalky Ну, я проверил nm на .a, отфильтрованном с помощью grep, чтобы увидеть, экспортированы ли эти символы.

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

Так что кажется, что для каждого символа есть неопределенная копия?

...