简体   繁体   中英

symbol(s) not found in XCode, Cocoa application

Though I've done some development in Java and and a little in C(++), I'm totally new to Apple's Objective C and XCode.

Thus, I'm totally stumped by the following error message:

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

It's from a default Cocoa application, with main.m looking like so:

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);
}

(Remember - just getting my feet wet here... Learning by screwing up, mainly :))

I'm guessing the IOKit lib isn't linked correctly (if I interpret the arcane musings of g++ correctly...), but I have no idea how to actually link it?

Any help appreciated - also any links to nice tutorials on creating your own Objective C apps.

Cheers!

Have you added IOKit as a linked framework? In XCode, expand Targets, then your target (BatteryApp I would guess), then Link Binary With Libraries. If you don't see IOKit, you'll want to add it.

Up at the top of the tree, look for the Frameworks directory. Right-click, Add, Existing Frameworks. Browse to /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/(appropriate SDK)/System/Library/Frameworks/IOKit.framework, and click OK.

Even though you added the simulator version of the framework, it is my belief that XCode will automatically switch the library search path as you switch between the Simulator and Device targets, so I think it's OK.

I believe you're correct in thinking that the IOKit framework isn't linked correctly. Here's how you can make sure:

  • Expand the "Targets" group in your groups and files tree and double click on the target that needs the IOKit. (Or right click and choose Get Info) The target's info panel will come up.
  • The first tab of the info panel is where we need to be. The bottom half of the tab is a list of Linked Libraries. The IOKit is probably not in that list, so click the plus button in the bottom left.
  • Scroll down a little bit until you see IOKit.framework. Select that, and click "Add". This will add the IOKit to your framework and link it into the target.

If you've already added the IOKit framework to your project, then you just need to verify that it's part of the "Link Binary with Libraries" phase of the appropriate target. (Targets group > expand your target > Link Binary with Libraries). If it's not there but it's in your project, then you can either follow the steps above or simply drag and drop the framework from wherever it is in your groups and files tree.

I'm no expert in Xcode/cocoa-touch myself, but according to this link it looks like the IOKit framework isn't available for the general public.

In the official docs, I found a quote that described IOKit as such: "Contains interfaces used by the device. Do not include this framework directly." So in the end, my desire to access that IOKit information was thwarted. For whatever reason, Apple has chosen to list it as a public framework but the reality is that it is not.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM