#objective-c #xcode #macos #linker #iokit
#objective-c #xcode #macos #компоновщик #iokit
Вопрос:
Я пытаюсь использовать набор ввода-вывода и правильно подключился к набору ввода-вывода.
Когда я использую функцию в наборе ввода-вывода и не вызываю ее в статической функции, я получаю следующую ошибку Undefined symbols for architecture x86_64
.
Вот пример для подавления ошибки
static void test(void)
{
if (IORegisterForSystemPower(...))
{
}
}
Вот пример, который вызовет ошибку.
void test(void)
{
if (IORegisterForSystemPower(...))
{
}
}
Есть предложения относительно того, почему это происходит?
Редактировать:
Вот точные сообщения об ошибках:
Undefined symbols for architecture x86_64:
"_IORegisterForSystemPower", referenced from:
_registerNotificaitonUsingIOKit in AppDelegate.o
"_IONotificationPortGetRunLoopSource", referenced from:
_registerNotificaitonUsingIOKit in AppDelegate.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Комментарии:
1. Можете ли вы вставить полный список сообщений об ошибках? Например, жалуется ли он на символ IORegisterForSystemPower?
2. Я добавил сообщения об ошибках. Пожалуйста, смотрите выше.
Ответ №1:
Хорошо, у меня есть один сценарий, когда это может произойти. Если статическая функция никогда не вызывается, вы не получите эту ошибку времени ссылки.
Например, я написал простой файл c с этой функцией, и undef_foobar
она не определена:
static int foobar (void)
{
undef_foobar ();
}
Теперь, если foobar()
вызывается из моего main()
, я получаю ошибку:
Undefined symbols for architecture x86_64:
"_undef_foobar", referenced from:
Если функция вообще не вызывается из этого файла c, ошибок компоновщика нет.
Комментарии:
1. Я попробовал ваш пример, и Xcode предупреждает меня о неопределенной функции
Implicit declaration of function "undef_foobar" is invalid in C99
. Не могли бы вы попробовать связать, а затем вызвать функцию из набора ввода-вывода, чтобы посмотреть, возникают ли у вас те же проблемы с компоновщиком?