c语言编译生成obj,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相关的文件类型展示如下:
.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源文件相关推荐
- 使用gcc编译和链接C语言程序,用GCC编译链接程序--编译链接器GCC常用功能(菜鸟级)...
转载自:http://daimajishu.iteye.com/blog/1089740 对gcc认识的一篇文章,就转载了,截取了自己感兴趣部分. 一,GCC编译器简介 虽然我们称Gcc是C语言的编译 ...
- c语言conflicting types,gcc编译C程序出现”error conflicting types for function”编译错误的分析解决...
今天使用gcc编译C语言程序时出现 "error conflicting types for function" 编译错误,这个错误的原因是什么?如何解决?以下看正文的讲解. 在使 ...
- 使用gcc编译c语言程序,用GCC编译C ++程序
在这里,我们将看到如何使用GCC(GNU C编译器)编译C ++程序.让我们考虑一下,我们要编译这个程序. 示例#include using namespace std; main() { cout ...
- gcc 编译多个源文件-转
一. 常用编译命令选项 假设源程序文件名为test.c. 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认输出为 ...
- linux 编译多个文件,linux gcc编译多个源文件的方法
华为荣耀6 H60-L02/L12(联通版)救砖包[适用于无限重启] 本帖最后由 HOT米粒 于 2014-11-16 20:43 编辑 华为荣耀6 H60-L02/L12(联通版)救砖包[适用于无限 ...
- 【Linux入门到精通系列讲解】Ubuntu下使用gcc编译并运行C程序
文章目录 1 hello 2 命令 3 linux下gcc编译多个源文件 1 hello 2 命令 在终端输入 Ubuntu命令 $ gcc hello.c -o hello $ ./hello == ...
- 让C语言写图形库时不关闭控制台,GCC编译Win图形程序不显示控制台方法
用VS编译openCV这些有控制台又有图形显示的程序,如果想隐藏控制台,只需要使用一行代码: #pragma comment( linker, "/subsystem:/"wind ...
- Linux GCC简明教程(使用GCC编译C语言程序)
文章目录 Gedit 编辑器 GCC 编译器 1) 生成可执行程序 2) 运行可执行程序 完整的演示 分步骤编译 1) 编译(Compile) 2) 链接(Link) 市面上常见的 Linux 都是发 ...
- gcc编译c语言多线程程序的步骤,GCC分步骤编译C语言程序
上节<GCC编译C语言程序完整演示>讲解的是通过gcc命令一次性完成编译和链接的整个过程,这样最方便,大家在学习C语言的过程中一般都这么做.实际上,gcc命令也可以将编译和链接分开,每次只 ...
最新文章
- 老李分享:Android -自动化埋点 2
- python dict遍历_python 字典(dict)遍历的四种方法性能测试报告
- @mapperscan注解_Spring的@Import注解详解
- 软件工程:汇编语言和C语言在软件工程的应用,计算机学生必看!
- 创建线程的办法 java 1615387415
- 农行运营合规管理心得体会_“乘风破浪”的农行合规达人秀来啦
- 常用cpu位数与变量长度表(不同编译器可能有差异)
- CocoaPods Mac App的安装和使用
- Git下修改提交的author和email信息
- c语言社交网络,图论在社交网络中的应用研究
- ghd oracle,ghd ORACLE双管卷发棒怎么样?具有离子夹外型、卷发棒功能简直是手残少女救星...
- 3322动态域名,nat123动态域名解析,dnspod域名解析,等相关免费动态域名解析软件对比
- java 门票订购系统_基于jsp的景区门票订购系统-JavaEE实现景区门票订购系统 - java项目源码...
- C. Mortal Kombat Tower(cf)dp
- 百度司南是什么产品?
- Python趣味绘图,一闪一闪亮晶晶,满天都是小星星
- nRF 协议栈操作相关
- 你知道二维码的图案原理吗?
- 关于火车运煤的一些想法
- python zip 函数