внешние переменные в статической библиотеке с использованием Objective-C

Я создал статическую библиотеку, которая будет связана с моими приложениями для 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", на который ссылается: -[Object testMethod] в test.o

"_a_variable" ссылается из: -[Object testMethod] в test.o

"_an_array", на который ссылается: -[Object testMethod] в test.o

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

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


person Ricardo Ferreira    schedule 25.06.2010    source источник


Ответы (2)


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

Кроме того, вам, вероятно, следует различать место, где вы объявляете эти вещи, где они действительно должны быть объявлены как 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, немного вводит в заблуждение!

person walkytalky    schedule 25.06.2010
comment
Я попытался с библиотекой, связанной с целевым приложением, а затем попытался с целевым приложением в зависимости от цели библиотеки. Оба дают одну и ту же ошибку. Что касается точки объявления/определения, у меня фактически есть значения и тела функций, определенные в файле .mm, я просто привел пример для простоты. Очевидно, что переменные не называются a_variable, я просто не могу показать свой код из-за сигильного контракта. - person Ricardo Ferreira; 25.06.2010
comment
@Ricardo Хорошо, это немного странно. Убедитесь, что библиотека (blah.a) действительно отображается в фазе Link Binary With Libraries целевого приложения. Также убедитесь, что библиотека действительно экспортирует необходимые символы. Если и то, и другое верно, то я в тупике... - person walkytalky; 25.06.2010
comment
Теперь, когда вы упомянули об этом, возможно, это не экспортирует символы, которые я хочу, глобально. Но как я могу быть в этом уверен? - person Ricardo Ferreira; 25.06.2010
comment
@ Рикардо Хороший вопрос. Xcode может предоставить удобный способ сделать это, но если да, то я не знаю, что это такое. Но вы можете запустить инструмент командной строки nm в файле библиотеки и найти соответствующие символы в выходных данных. Вероятно, ваши переменные должны иметь тип D, а тип функций — T. - person walkytalky; 25.06.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

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

person Ricardo Ferreira    schedule 25.06.2010
comment
Хотел бы я притвориться, что знаю, что это значит, но я этого не знаю. Похоже, что файл .a может содержать несколько таблиц символов - может быть, для разных архитектур? -- и компоновщик ищет символы там, где они не определены. Но это несколько выходит за рамки моих знаний, так что не слушайте меня. Надеюсь, кто-то, кто знает, о чем они говорят, скоро появится! - person walkytalky; 25.06.2010
comment
хорошо, спасибо за вашу помощь :) Если я не смогу решить это за день или около того, я просто прибегну к копированию заголовков и файлов реализации. - person Ricardo Ferreira; 25.06.2010