Я создал статическую библиотеку, чтобы быть связанным в моих приложениях для 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: идентификатор возвратил 1 статус выхода
Кто-либо когда-либо сталкивался с этой проблемой прежде? Я знаю, что делаю что-то глупое, я пропускаю некоторый ключевой Objective C или понятие C, но я не могу действительно видеть что. Таким образом, я надеялся, что кто-то мог помочь мне.Заранее спасибо.
Это ошибки компоновщика, сообщая вам, что указанные объекты не могут быть найдены. Вероятно, это означает, что вы не добавили свою библиотеку в проект.
В стороне, вам, вероятно, следует различать место, где вы объявляете эти вещи, где они действительно должны быть объявлены как 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
немного вводит в заблуждение!
@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
Итак, похоже, что для каждого символа есть неопределенная копия?