Почему статические функции устраняют неопределенные символы в Xcode?

#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 . Не могли бы вы попробовать связать, а затем вызвать функцию из набора ввода-вывода, чтобы посмотреть, возникают ли у вас те же проблемы с компоновщиком?