在XCode,Cocoa应用程序中找不到的符号

时间:2009-07-21 13:36:03

标签: objective-c

虽然我已经完成了一些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 lib没有正确链接(如果我正确地解释了g +​​+的神秘冥想......),但我不知道如何实际链接它?

任何帮助表示赞赏 - 也可以链接到有关创建自己的Objective C应用程序的精彩教程。

干杯!

3 个答案:

答案 0 :(得分:7)

您是否已将IOKit添加为链接框架?在XCode中,展开Targets,然后是你的目标(我会猜测BatteryApp),然后是Link Binary With Libraries。如果您没有看到IOKit,则需要添加它。

在树的顶部,查找Frameworks目录。右键单击,添加,现有框架。浏览到/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/(适当的SDK)/System/Library/Frameworks/IOKit.framework,然后单击OK。

即使您添加了框架的模拟器版本,我相信当您在模拟器和设备目标之间切换时,XCode会自动切换库搜索路径,所以我认为没关系。

答案 1 :(得分:4)

我认为你认为IOKit框架没有正确链接是正确的。以下是您可以确定的方法:

  • 展开组和文件树中的“Targets”组,然后双击需要IOKit的目标。 (或者右键单击并选择“获取信息”)目标的信息面板将会出现。
  • 信息面板的第一个标签是我们需要的位置。选项卡的下半部分是链接库列表。 IOKit可能不在该列表中,因此请单击左下角的加号按钮。
  • 向下滚动一下,直到看到IOKit.framework。选择它,然后单击“添加”。这会将IOKit添加到您的框架并将其链接到目标。

如果您已经将IOKit框架添加到项目中,那么您只需要验证它是相应目标的“Link Binary with Libraries”阶段的一部分。 (目标组&gt;扩展您的目标&gt;链接二进制文件与库)。如果它不在你的项目中,那么你可以按照上面的步骤操作,或者只是将框架拖放到组和文件树中的任何位置。

答案 2 :(得分:0)

我自己并不是Xcode / cocoa-touch的专家,但根据this链接,看起来IOKit框架不适用于普通大众。

  

在官方文档中,我发现了一个引用IOKit的引文:“包含设备使用的接口。不要直接包含此框架。”所以最后,我对访问IOKit信息的渴望受到了挫败。无论出于何种原因,Apple已选择将其列为公共框架,但事实是它不是。