GCC编译Objective-C源文件
本章主要讲的是使用 GCC 编译 Objective-C。
Objective-C 可以把它看成是 C 语言的扩充,同时它又支持类的使用,所以也是面向对象的编程语言,通常写作是 ObjC 或者是 OC。它主要用于 Mac OS X 和 GNU step 系统。因为 GCC 中包含 Objective-C 源程序的编译器,所以在 Linux 系统上可以开发这种编程语言。但是它与 GCC 编译的其它语言不同,Objective-C 在 GCC 中没有标准定义。
Objective-C相关的文件类型展示如下:
实例:创建一个 Objective-C 文件的源文件 test.m。
当然,我们也可以看到与 C 语言不同的地方,Objective-C 源程序包含头文件使用的是 #import 取代了关键字 #include。这两个关键字作用是相同的,但是 #import 不仅可以用来包含头文件,而且在编译相同单元的时侯不会被多次包括进来。如果想要利用 #include 来达到相同的效果,需要在头文件中使用条件编译。
选项
类方法在书写上有格式的要求,必须以加号(+)开头。使用时只能由类来调用,并且不能访问成员变量。
对象方法在书写格式上也有要求,以减号(-)开头。使用时只能由对象来调用,对象方法中可以访问当前对象的成员变量。
类在使用的时候注意事项:
编译包含对象的 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 <stdio.h> 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语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算