为什么使用cocoa库的HelloWorld代码无法构建?

时间:2014-02-27 05:41:42

标签: objective-c macos cocoa

代码是这样的:

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[])
{

    @autoreleasepool {

        // insert code here...

        NSLog(@"Hello, World!");
    }
    NSAlert *alert = [[NSAlert alloc] init];
    [alert setMessageText:@"Hi there."];
    [alert runModal];


    return 0;
}

我想要的是:当我从命令行调用时,当我关闭警告框时,此程序会弹出一个警告框。程序退出。

但在建造时,它会抱怨:

Ld /Users/hanfei/Library/Developer/Xcode/DerivedData/KeyCatcher-hijnrqhwiafuxtdjmdubtsijyhwh/Build/Products/Debug/KeyCatcher normal x86_64
    cd /Users/hanfei/Desktop/KeyCatcher
    setenv MACOSX_DEPLOYMENT_TARGET 10.9
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -L/Users/hanfei/Library/Developer/Xcode/DerivedData/KeyCatcher-hijnrqhwiafuxtdjmdubtsijyhwh/Build/Products/Debug -F/Users/hanfei/Library/Developer/Xcode/DerivedData/KeyCatcher-hijnrqhwiafuxtdjmdubtsijyhwh/Build/Products/Debug -filelist /Users/hanfei/Library/Developer/Xcode/DerivedData/KeyCatcher-hijnrqhwiafuxtdjmdubtsijyhwh/Build/Intermediates/KeyCatcher.build/Debug/KeyCatcher.build/Objects-normal/x86_64/KeyCatcher.LinkFileList -mmacosx-version-min=10.9 -fobjc-arc -fobjc-link-runtime -framework Foundation -Xlinker -dependency_info -Xlinker /Users/hanfei/Library/Developer/Xcode/DerivedData/KeyCatcher-hijnrqhwiafuxtdjmdubtsijyhwh/Build/Intermediates/KeyCatcher.build/Debug/KeyCatcher.build/Objects-normal/x86_64/KeyCatcher_dependency_info.dat -o /Users/hanfei/Library/Developer/Xcode/DerivedData/KeyCatcher-hijnrqhwiafuxtdjmdubtsijyhwh/Build/Products/Debug/KeyCatcher

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_NSAlert", referenced from:
      objc-class-ref in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

当我为新项目选择模板时,我选择command line tool而不是CoCoa Application,因为我只需要CoCoa来显示警告框。有没有人对此有所了解..

4 个答案:

答案 0 :(得分:1)

那是因为NSAlert不是#imported

创建命令行工具时,默认情况下不包括

AppKit.h,正如您在链接中看到的那样,AppKit导入NSAlert.h

编辑:
首先,要编译,您需要在项目中添加 Cocoa 框架。

其次,所有代码都应该包含在@autoreleasepool部分

@autoreleasepool {

    // insert code here...
    NSLog(@"Hello, World!");
    NSAlert *alert = [[NSAlert alloc] init];
    [alert setMessageText:@"Hi there."];
    [alert runModal];    
}

您的代码将编译并运行,但我认为您还会遇到其他一些运行时错误。

答案 1 :(得分:0)

你需要在主函数

之前添加它
    #import <AppKit/AppKit.h>

答案 2 :(得分:0)

我在使用NSAlert的C ++项目中遇到了同样的错误,这对我有用:

1)添加

#include <Cocoa/Cocoa.h>

2)在项目中添加Cocoa框架 - &gt; Buld阶段 - >使用库链接二进制文件。

3)设置&#34;类型&#34;所有我的.cpp文件到&#34; Objective-C ++ Source&#34;在xCode中最右边的列中。

答案 3 :(得分:0)

您需要像其他人一样导入AppKit,并且 - 与框架一样重要 - 您需要一个运行循环。所以在runModal

之前插入
[NSApplication sharedApplication];

启动“应用程序”和运行循环