如何在 Xcode 之外编译并运行 Objective-C 文件?

jMa*_*Man 2 xcode gcc objective-c

我尝试gcc在终端中运行用 Xcode 编写的多个 HelloWorld 文件。为了简洁起见,这是来自TutorialsPoint的一个示例,位于一个名为 的独立文件中myStandaloneHelloWorld.m

#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
- (void)sampleMethod;
@end

@implementation SampleClass

- (void)sampleMethod{
    NSLog(@"Hello, World! \n");
}

@end

int main()
{
    /* my first program in Objective-C */
    SampleClass *sampleClass = [[SampleClass alloc]init];
    [sampleClass sampleMethod];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它在 Xcode 中编译,但gcc myStandaloneHelloWorld.m在终端中运行时,会产生以下错误列表:

Undefined symbols for architecture x86_64:
  "_NSLog", referenced from:
      -[SampleClass sampleMethod] in myStandaloneHelloWorld-0af75e.o
  "_OBJC_CLASS_$_NSObject", referenced from:
      _OBJC_CLASS_$_SampleClass in myStandaloneHelloWorld-0af75e.o
  "_OBJC_METACLASS_$_NSObject", referenced from:
      _OBJC_METACLASS_$_SampleClass in myStandaloneHelloWorld-0af75e.o
  "___CFConstantStringClassReference", referenced from:
      CFString in myStandaloneHelloWorld-0af75e.o
  "__objc_empty_cache", referenced from:
      _OBJC_METACLASS_$_SampleClass in myStandaloneHelloWorld-0af75e.o
      _OBJC_CLASS_$_SampleClass in myStandaloneHelloWorld-0af75e.o
  "_objc_msgSend", referenced from:
      _main in myStandaloneHelloWorld-0af75e.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

我知道还有其他框架和语法(例如,Xcode 命令行工具在 Xcode 中运行的语法非常不同),但是在终端中运行的这种语法有什么问题吗?

Ken*_*ses 7

您的程序依赖于 Foundation 框架。正如您必须告诉编译器(或链接器)您的程序需要的库一样,您也必须告诉它有关框架的信息。

使用:

gcc myStandaloneHelloWorld.m -framework Foundation
Run Code Online (Sandbox Code Playgroud)

  • 编译命令生成一个名为 a.out 的可执行文件。由于历史原因,如果您不指定名称,那么这个奇怪的名称就是默认名称。您可以使用“./a.out”运行它。(如果您想要不同的名称,可以对编译器使用“-o”选项,如下所示:“gcc -o myStandaloneHelloWorld myStandaloneHelloWorld.m -framework Foundation”。您可以使用“./myStandaloneHelloWorld”运行生成的可执行文件。 ) (2认同)