用GCC编译*.mm

Arc*_*676 2 c gcc objective-c

我在.mm文件中制作了一个非常简单的Objective-C/C程序,但我不知道如何链接Objective-C库/框架.我只需要Foundation框架.我怎样才能做到这一点?我不想在Xcode中这样做,因为Xcode总是创建一个包含项目文件的整个文件夹,然后将产品隐藏在一个难以找到的文件夹中,我觉得它是用于单文件程序的大量内存.

码:

#include <stdio.h>
#import <Foundation/Foundation.h>

NSString* charToNSString(char * c){
    return [NSString stringWithUTF8String:c];
}

const char* NSStringToChar(NSString *str){
    return [str UTF8String];
}

int main(int argc, char * argv[]){
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译: gcc file.mm

输出:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_NSString", referenced from:
      objc-class-ref in file-4bd3e4.o
  "_objc_msgSend", referenced from:
      charToNSString(char*) in file-4bd3e4.o
      NSStringToChar(NSString*) in file-4bd3e4.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)

Ind*_*ore 7

$ gcc -framework Foundation main.mm
Run Code Online (Sandbox Code Playgroud)

虽然上面的命令工作得很好,但我建议你创建Makefile

$vim Makefile
Run Code Online (Sandbox Code Playgroud)

粘贴下面的内容

CC=gcc

FRAMEWORKS:= -framework Foundation

SOURCE=main.mm

OUT=-o main

all:
        $(CC) $(SOURCE) $(FRAMEWORKS) $(OUT)
#   ^ this is a tab not spaces, if you give spaces here it will through error :*** missing separator
Run Code Online (Sandbox Code Playgroud)

然后运行

$ make
Run Code Online (Sandbox Code Playgroud)

看看这个关于Makefile的简单教程

  • 是的,有许多好处,你只有一个源文件,因此使`Makefile`没有意义,但随着项目大小的增加,你可以在`Makefile`中指定目标变得更加乏味.你可以阅读一篇关于它的好博客[为什么要使用Makefile](http://bost.ocks.org/mike/make/) (4认同)