linux下编译器的使用

源文件编译的过程

使用C语言编写一段程序称之为源程序,这个程序是不能直接执行的,需要编译成可执行代码,过程:源程序->预处理->编译->汇编->汇编->链接->可执行代码。

  1. 拿到一个源程序首先需要进行预处理,预处理的结果便是将头文件的内容放入这个文件中,比如一个C语言程序通常需要包含stdio.h头文件,这个头文件里包含一些函数和变量的声明,预处理便会将这个文件里的内容放入。
  2. 编译阶段,这个阶段是将我们的C语言代码翻译成汇编代码。
  3. 汇编阶段,汇编阶段表示将汇编的代码翻译成机器代码,现在已经是一个二进制文件。
  4. 链接阶段,链接表示将一些函数的实现和目标代码链接在一起,预处理阶段只是将函数的声明放入文件中,并没有将函数的实现放入其中因此需要进行链接才能执行。
  5. 经过链接阶段以后便是可以执行的代码了。

gcc讲解

直接生成可执行代码
gcc test.c
会自动生成a.out文件 这个文件可以直接执行

生成指定文件名的可执行文件
gcc test.c -o test
会生成test的可执行文件

只对文件进程预处理
gcc test.c -o test.i -E
生成一个test.i的文件,这个文件包含指定头文件的内容

生成汇编文件
gcc test.i -S -o test.s
生成一个汇编表示的文件

生成目标文件
gcc test.s -c test.o
生成一个二进制的目标文件 这个文件不能直接执行 因为没有进行链接

生成可执行文件
gcc test.o -o test
生成可执行文件

在预处理阶段需要将头文件的内容插入到源代码中,系统默认搜索的路径是/usr/include,大部分头文件都在这个文件中,在源文件中包含的方式为<stdio.h>这种形式默认是搜索的这个路径,还有一种包含方式 "head.h"这种形式默认是搜索的本目录,有的时候可以直接指定要包含的头文件eg:gcc test.c -o test -l dir 表示在指定的目录下搜索头文件。

同样在链接阶段需要链接文件,也会一个默认的目录去搜索,同样可以指定一个目录eg:gcc test.c -o test -L dir 其中-L表示增加要搜索的函数库。

make工程文件

在linux下使用make命令会执行Makefile文件

Makefile文件的编写规则

test:   mid.o add.o test.o    	//生成的文件test后面是依赖的文件
        gcc mid.o add.o test.o -o test   //执行的命令   链接操作
test.o: test.c am.h
        gcc test.c -c -o test.o
mid.o:  mid.c
        gcc mid.c -c -o mid.o
add.o:  add.c
        gcc add.c -c -o add.o

看下面一个例子

test.c
#include"am.h"
#include<stdio.h>
int main()
{
int a=2,b=4;
printf("%d\n",add(a,b));
printf("%d\n",mid(a,b));
}

mid.c
int mid(int a,int b)
{
        return (a+b)/2;
}

add.c
int add(int a,int b)
{
        return a+b;
}


am.h
int add(int a,int b);
int mid(int a,int b);


Makefile

test:   mid.o add.o test.o    	//生成的文件test后面是依赖的文件
        gcc mid.o add.o test.o -o test   //执行的命令   链接操作
test.o: test.c am.h
        gcc test.c -c -o test.o
mid.o:  mid.c
        gcc mid.c -c -o mid.o
add.o:  add.c
        gcc add.c -c -o add.o

执行结果:
sun@ubuntu:~/project$ make
gcc mid.c -c -o mid.o
gcc add.c -c -o add.o
gcc test.c -c -o test.o
gcc mid.o add.o test.o -o test

make执行过程:

  1. 在输入make命令时会自动寻找makefile或者Makefile文件
  2. 在执行第一条命令之前会检查依赖的文件是否存,在当依赖的文件不存在时会先生成需要的依赖文件。
  3. 当我们更新一个已将编译好的工程时,再执行make命令,会检查依赖文件更新的时间是否比生成目标的时间晚,如果比目标的时间晚时会执行编译操作,表示这个文件更新了需要重新生成。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值