在命令行编译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
-F
dir
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,我会专门开篇文章介绍。
完
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.
谢谢,帮大忙了。我用的不是命令行,不过我很好奇直接这样指定 -framework Foundation ,路径能够找到吗?默认的framework search path 就是system/library/framework ?
谢谢你的问题,我已经更新了文章,回答了这个问题
我怎么不用这个也OK/
也许你可以共享一下你的
>$ gcc –version
的输出,默认的苹果系统的gcc在不指定framework情况下,应该是不会自己找到对应的framework的