Символ (ы) не найден в приложении 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 решила включить его в публичную структуру, но реальность такова, что это не так.