Символ (ы) не найден в приложении XCode, Cocoa

Хотя я немного поработал на Java и немного на C(++), я совершенно новичок в Apple Objective C и XCode.

Таким образом, я полностью озадачен следующим сообщением об ошибке:

Building target “BatteryApp” of project “BatteryApp” with configuration “Debug” — (1 error)
        cd /Users/soren/Documents/BatteryApp
    setenv MACOSX_DEPLOYMENT_TARGET 10.5
    /Developer/usr/bin/gcc-4.0 -arch i386 -isysroot /Developer/SDKs/MacOSX10.5.sdk -L/Users/soren/Documents/BatteryApp/build/Debug -F/Users/soren/Documents/BatteryApp/build/Debug -filelist /Users/soren/Documents/BatteryApp/build/BatteryApp.build/Debug/BatteryApp.build/Objects-normal/i386/BatteryApp.LinkFileList -mmacosx-version-min=10.5 -framework Cocoa -o /Users/soren/Documents/BatteryApp/build/Debug/BatteryApp.app/Contents/MacOS/BatteryApp
Undefined symbols:
  "_IOPSCopyPowerSourcesList", referenced from:
      _main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
          "_IOPSCopyPowerSourcesList", referenced from:
              _main in main.o
        ld: symbol(s) not found
        collect2: ld returned 1 exit status

Это из стандартного приложения Cocoa, где main.m выглядит так:

import <Cocoa/Cocoa.h>
import <IOKit/ps/IOPowerSources.h>

int main(int argc, char *argv[])
{
    CFTypeRef powerInfo;
    IOPSCopyPowerSourcesList(powerInfo);
    NSLog(@"Foo");
    //return NSApplicationMain(argc,  (const char **) argv);
}

(Помните - здесь просто промокают ноги... Учимся, в основном, облажаясь:))

Я предполагаю, что библиотека IOKit неправильно связана (если я правильно интерпретирую тайные размышления о g++), но я не знаю, как на самом деле связать ее?

Любая помощь приветствуется - также любые ссылки на хорошие учебники по созданию ваших собственных приложений Objective C.

Ура!

3 ответа

Решение

Вы добавили IOKit в качестве связанной структуры? В XCode разверните Targets, затем свою цель (BatteryApp, я бы предположил), затем Link Binary With Libraries. Если вы не видите IOKit, вы захотите добавить его.

Вверху дерева найдите каталог Frameworks. Щелкните правой кнопкой мыши, Добавить, Существующие фреймворки. Перейдите к /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/(ptable SDK)/System/Library/Frameworks/IOKit.framework и нажмите кнопку ОК.

Несмотря на то, что вы добавили симуляционную версию фреймворка, я уверен, что XCode автоматически переключит путь поиска в библиотеке при переключении между целями Simulator и Device, поэтому я думаю, что все в порядке.

Я считаю, что вы правы, считая, что структура IOKit не связана правильно. Вот как вы можете убедиться:

  • Разверните группу "Цели" в дереве групп и файлов и дважды щелкните по цели, для которой требуется IOKit. (Или щелкните правой кнопкой мыши и выберите "Получить информацию"). Появится информационная панель цели.
  • Первая вкладка информационной панели - то, где мы должны быть. Нижняя половина вкладки представляет собой список связанных библиотек. IOKit, вероятно, отсутствует в этом списке, поэтому нажмите кнопку "плюс" в левом нижнем углу.
  • Прокрутите немного вниз, пока не увидите IOKit.framework. Выберите это и нажмите "Добавить". Это добавит IOKit в ваш фреймворк и свяжет его с целью.

Если вы уже добавили инфраструктуру IOKit в свой проект, вам просто нужно убедиться, что она является частью фазы "Связать двоичные файлы с библиотеками" соответствующей цели. (Целевая группа> развернуть цель> связать двоичные файлы с библиотеками). Если его там нет, но он есть в вашем проекте, то вы можете либо выполнить действия, описанные выше, либо просто перетащить фреймворк из любого места в дереве групп и файлов.

Я сам не эксперт в Xcode/cocoa-touch, но по этой ссылке похоже, что среда IOKit недоступна для широкой публики.

В официальных документах я нашел цитату, описывающую IOKit как таковую: "Содержит интерфейсы, используемые устройством. Не включайте эту платформу напрямую". Так что, в конце концов, мое желание получить доступ к этой информации IOKit было сорвано. По какой-то причине Apple решила включить его в публичную структуру, но реальность такова, что это не так.

Другие вопросы по тегам