本章主要讲的是使用 GCC 编译 Objective-C。

Objective-C 可以把它看成是 C 语言的扩充,同时它又支持类的使用,所以也是面向对象的编程语言,通常写作是 ObjC 或者是 OC。它主要用于 Mac OS X 和 GNU step 系统。因为 GCC 中包含 Objective-C 源程序的编译器,所以在 Linux 系统上可以开发这种编程语言。但是它与 GCC 编译的其它语言不同,Objective-C 在 GCC 中没有标准定义。

Objective-C相关的文件类型展示如下:

.a 为静态库文件,跟C/C++相同

.h 为头文件

.m 为需要预处理的 Objective-C 源文件

.mi 为不需要预处理的 Objective-C 源文件

.o 为适用于连接的目标文件格式

.so 为动态链接库文件

编译Objective-C源文件

从各种角度上看,Objective-C 程序与 C 程序在编写语法上非常的相似。可以说编写不包含对象的 Objective-C 程序与 C 程序的语法形式完全相同。

实例:创建一个 Objective-C 文件的源文件 test.m。

/*test.m*/

#import

int main(void)

{

printf("hello world\n");

return 0;

}

编译源文件的命令如下:

gcc test.m -lobjc -o test

使用上面命令编译的时候可能会报错,如果出现下面的错误信息:

gcc: error trying to exec ‘cclobj’: execvp: 没有那个文件或目录

那是因为缺少了相关的库文件,可以通过如下的命令安装:

sudo apt-get install gobjc gnustep gnustep-devel

如果文件的语法格式没有出现错误,我们再去执行的时候就不会产生错误了。这就是使用 gcc 编译 Objective-C 源文件,编译时可以通过参数选项-Wno-import来禁止显示警告消息。

当然,我们也可以看到与 C 语言不同的地方,Objective-C 源程序包含头文件使用的是 #import 取代了关键字 #include。这两个关键字作用是相同的,但是 #import 不仅可以用来包含头文件,而且在编译相同单元的时侯不会被多次包括进来。如果想要利用 #include 来达到相同的效果,需要在头文件中使用条件编译。

选项-lobjc指出使用的库是 libobjc.a(Objective-C的对象库),但实际上对于没有对象的简单程序,这个选项并不是必须的。编译程序时,通过文件名的后缀名 .m 被识别为 Objective-C 源程序,选项-o用于指定输出文件的名字,默认的输出文件名也是 a.out。

编译包含对象的源文件

Objective-C编程语言是面向对象的编程语言,我们来看一下这种编程语言中类的创建和使用。

类方法在书写上有格式的要求,必须以加号(+)开头。使用时只能由类来调用,并且不能访问成员变量。

对象方法在书写格式上也有要求,以减号(-)开头。使用时只能由对象来调用,对象方法中可以访问当前对象的成员变量。

类在使用的时候注意事项:

Objective-C 是单继承。

基本上所有类的根类是 NSObject。

不允许子类和父类拥有相同名称的成员变量。

父类必须声明在子类前面,实现不用在子类前。

调用某个对象/类的方法时,优先去当前对象/类中找,若找不到去父类中找。

子类会继承父类所有的变量不管是否是私有,只是能不能直接访问的问题。

父类只在 implementation 里定义的变量,子类也会继承。

编译包含对象的 Objective-C 源文件。编译文件使用如下的命令:

gcc main.m -o main.o

gcc Speak.m -o Speak.o

gcc main.o Speak.o -lobjc -o main

我们还可以使用另一种方法:

gcc main.m Speak.m -lobjc -o main

制作静态库文件

将需要封装成静态库文件的源文件编译生成 .o 目标文件:

gcc  test.m  -o test.o

使用 ar 命令制作成静态库文件:

ar -r libtest.a test.o

通过上面的流程可以发现,Objective-C 与 C 语言制作静态库文件的方式,当然使用的方法也是相同的,具体的制作流程可以参考 C 语言。

制作共享库

为需要封装的源文件创建目标文件:

Gcc -fpic -Wno-import -c test.m -o test.o

需要添加编译选项-fpic。为了让编译的源文件可以载入内存中的任何位置,并且能够从载入的位置执行目标代码。

将目标文件创建成共享库:

gcc -shared test.o -o test.so

我们可以将这两条命令组合成为一条命令:

gcc -fpic -shared test.m -o test.so

c语言编译生成obj,GCC编译Objective-C源文件相关推荐

  1. 使用gcc编译和链接C语言程序,用GCC编译链接程序--编译链接器GCC常用功能(菜鸟级)...

    转载自:http://daimajishu.iteye.com/blog/1089740 对gcc认识的一篇文章,就转载了,截取了自己感兴趣部分. 一,GCC编译器简介 虽然我们称Gcc是C语言的编译 ...

  2. c语言conflicting types,gcc编译C程序出现”error conflicting types for function”编译错误的分析解决...

    今天使用gcc编译C语言程序时出现 "error conflicting types for function" 编译错误,这个错误的原因是什么?如何解决?以下看正文的讲解. 在使 ...

  3. 使用gcc编译c语言程序,用GCC编译C ++程序

    在这里,我们将看到如何使用GCC(GNU C编译器)编译C ++程序.让我们考虑一下,我们要编译这个程序. 示例#include using namespace std; main() { cout  ...

  4. gcc 编译多个源文件-转

    一. 常用编译命令选项 假设源程序文件名为test.c. 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认输出为 ...

  5. linux 编译多个文件,linux gcc编译多个源文件的方法

    华为荣耀6 H60-L02/L12(联通版)救砖包[适用于无限重启] 本帖最后由 HOT米粒 于 2014-11-16 20:43 编辑 华为荣耀6 H60-L02/L12(联通版)救砖包[适用于无限 ...

  6. 【Linux入门到精通系列讲解】Ubuntu下使用gcc编译并运行C程序

    文章目录 1 hello 2 命令 3 linux下gcc编译多个源文件 1 hello 2 命令 在终端输入 Ubuntu命令 $ gcc hello.c -o hello $ ./hello == ...

  7. 让C语言写图形库时不关闭控制台,GCC编译Win图形程序不显示控制台方法

    用VS编译openCV这些有控制台又有图形显示的程序,如果想隐藏控制台,只需要使用一行代码: #pragma comment( linker, "/subsystem:/"wind ...

  8. Linux GCC简明教程(使用GCC编译C语言程序)

    文章目录 Gedit 编辑器 GCC 编译器 1) 生成可执行程序 2) 运行可执行程序 完整的演示 分步骤编译 1) 编译(Compile) 2) 链接(Link) 市面上常见的 Linux 都是发 ...

  9. gcc编译c语言多线程程序的步骤,GCC分步骤编译C语言程序

    上节<GCC编译C语言程序完整演示>讲解的是通过gcc命令一次性完成编译和链接的整个过程,这样最方便,大家在学习C语言的过程中一般都这么做.实际上,gcc命令也可以将编译和链接分开,每次只 ...

最新文章

  1. 老李分享:Android -自动化埋点 2
  2. python dict遍历_python 字典(dict)遍历的四种方法性能测试报告
  3. @mapperscan注解_Spring的@Import注解详解
  4. 软件工程:汇编语言和C语言在软件工程的应用,计算机学生必看!
  5. 创建线程的办法 java 1615387415
  6. 农行运营合规管理心得体会_“乘风破浪”的农行合规达人秀来啦
  7. 常用cpu位数与变量长度表(不同编译器可能有差异)
  8. CocoaPods Mac App的安装和使用
  9. Git下修改提交的author和email信息
  10. c语言社交网络,图论在社交网络中的应用研究
  11. ghd oracle,ghd ORACLE双管卷发棒怎么样?具有离子夹外型、卷发棒功能简直是手残少女救星...
  12. 3322动态域名,nat123动态域名解析,dnspod域名解析,等相关免费动态域名解析软件对比
  13. java 门票订购系统_基于jsp的景区门票订购系统-JavaEE实现景区门票订购系统 - java项目源码...
  14. C. Mortal Kombat Tower(cf)dp
  15. 百度司南是什么产品?
  16. Python趣味绘图,一闪一闪亮晶晶,满天都是小星星
  17. nRF 协议栈操作相关
  18. 你知道二维码的图案原理吗?
  19. 关于火车运煤的一些想法
  20. python zip 函数

热门文章

  1. PaaS服务之路漫谈(一)
  2. Yoshua Bengio首次中国演讲:深度学习通往人类水平AI的挑战
  3. 洛谷P2158 [SDOI2008]仪仗队
  4. FLV Extract 1.2.1
  5. pyspark randomSplit代码示例
  6. Linux split命令:拆分大的tar压缩包然后解压
  7. 查看docker镜像的dockerfile脚本json信息
  8. 阿里DataV可视化大屏基本操作
  9. Scala键盘录入代码示例
  10. Scala声明函数示例