虽然我已经完成了一些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应用程序的精彩教程。
干杯!
答案 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框架没有正确链接是正确的。以下是您可以确定的方法:
如果您已经将IOKit框架添加到项目中,那么您只需要验证它是相应目标的“Link Binary with Libraries”阶段的一部分。 (目标组&gt;扩展您的目标&gt;链接二进制文件与库)。如果它不在你的项目中,那么你可以按照上面的步骤操作,或者只是将框架拖放到组和文件树中的任何位置。
答案 2 :(得分:0)
我自己并不是Xcode / cocoa-touch的专家,但根据this链接,看起来IOKit框架不适用于普通大众。
在官方文档中,我发现了一个引用IOKit的引文:“包含设备使用的接口。不要直接包含此框架。”所以最后,我对访问IOKit信息的渴望受到了挫败。无论出于何种原因,Apple已选择将其列为公共框架,但事实是它不是。