在命令行编译objective c

在命令行编译objective c

xcode提供的环境很舒服,很方便。但是你可能需要在命令行下面编译代码,下面就看看怎么做。

先来点测试代码吧:

main.m

#import <Foundation/Foundation.h>


int main( int argc, char** argv )
{
    NSLog( @"this is main function" );
    return 0;
}

很简单的源码,就是输出一句话。

编译器吗,当然是使用gcc了,那命令呢?我们按照最简单的命令开始尝试。

 

>$ gcc -o main main.m

 

结果一堆错误

Undefined symbols for architecture x86_64:
  “_NSLog”, referenced from:
      _main in ccjAlmho.o
  “___CFConstantStringClassReference”, referenced from:
      CFString in ccjAlmho.o
  “_objc_msgSend_fixup”, referenced from:
      l_objc_msgSend_fixup_autorelease in ccjAlmho.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

 

google发现有人说需要链接object c的库, -lobjc,觉得有道理啊,从错误看是因为链接的时候出的错啊,加上-lobjc再试,

>$ gcc -o main main.m  -lobjc

但是发现问题依旧。

后来回去xcode看看,它是使用framework,而我们代码用到的是Foundation这个framework,那gcc是不是也有对应选项,查看gcc的帮助手册,确实有。因此我们的命令就变成

>$ gcc -o main main.m -framework Foundation

成功了。

>$ ./main

来运行看看结果吧

this is main function

下面简单解释以下gcc的选项 framework,这个是gcc针对darwin操作系统的选项,关于更多的darwin系统的gcc选项,强参看

https://gcc.gnu.org/onlinedocs/gcc/Darwin-Options.html

苹果的操作系统就是基于Darwin的,因此上面链接所列出的选项适用于苹果操作系统,有些朋友问,为什么上面的命令行没有列出framework的搜索路径,gcc就可以找到我们指定的Foundation这个framework,那是因为Foundation.framework这个文件是在标准的系统路径文件下面

/System/Library/Frameworks

如果不在这个路径下面就需要使用另外一个选项来指定路径,-F

-Fdir

Add the framework directory dir to the head of the list of directories to be searched for header files. These directories are interleaved with those specified by -I options and are scanned in a left-to-right order.

前面提到framework这个选项是Darwin的gcc特有的,不信你可以在Linux下面执行下面的命令看看

$ gcc -framework Foundation main.c -o main

输出:

gcc: error: unrecognized command line option ‘-framework’

那我们看看Darwin的gcc和Linux的gcc有什么不同

—– Linux的gcc

$ gcc –version

gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

—- Darwin的gcc

$ gcc –version

Configured with: –prefix=/Applications/Xcode.app/Contents/Developer/usr
–with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.42.1)
    Target: x86_64-apple-darwin15.6.0
    Thread model: posix
    InstalledDir:
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

其实Darwin的gcc和Linux下面的gcc完全是2个分支,darwin的gcc的前端是clang,后端是LLVM

关于更多clang和LLVM,我会专门开篇文章介绍。

 

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

4 thoughts on “在命令行编译objective c

  1. xingheng2

    谢谢,帮大忙了。我用的不是命令行,不过我很好奇直接这样指定 -framework Foundation ,路径能够找到吗?默认的framework search path 就是system/library/framework ?

    Reply
    1. leo2013 Post author

      也许你可以共享一下你的
      >$ gcc –version
      的输出,默认的苹果系统的gcc在不指定framework情况下,应该是不会自己找到对应的framework的

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *