Ubuntu下使用GCC和Makefile编译c文件
前言
本文是熟悉并掌握在Linux系统中GCC和Makefile两种方式编译连接并运行c程序,并在windows操作系统上选择一种编译工具运行程序,体会两者的异同。
一、GGC命令行模式
预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删掉,这里并不会检查语法;
编译:检查语法,将预处理后的文件编译成汇编文件;
汇编: 将汇编文件生成目标文件(二进制文件);
链接: C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到可执行程序中去。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e21df3457ee7494dad6d2086983b5e2a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bWM5YWl5byP5bCP55m9,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
GCC命令 |
操作 |
gcc-E |
只进行预处理 |
gcc-S |
只进行预处理和编译 |
gcc-c |
只编译并生成目标文件 |
gcc-o |
生成指定文件名的可执行文件 |
1.vim创建文件
创建sub1.c以及sub1.h
vim sub1.h
#ifndef _SUB1_H
#define _SUB1_H
float x2x(int a, int b);
#endif
vim sub1.c
#include <stdio.h>
#include “sub1.h”
float x2x(int a, int b)
{
return (float)(a+b);
}
创建main.c文件
vim main.c
#include <stdio.h>
#include "sub1.h"
int main()
{
int x=2, y=9;
float sum;
sum=x2x(x,y);
printf("%0.2f\n",sum);
}
2.gcc编译
参考
如果只有单个文件,一般直接执行下面这条命令就可以进行编译了。
执行命令:gcc 文件名.c -o 目标文件名. 如果目标文件名不写,则默认编译出a.out的目标文件(Linux环境下)。
但是并不是想要一次性得到最终的.out文件,而是需要得到编译过程中的一些中间文件,例如汇编代码文件,那么就需要分步编译了。
1.编译出目标文件
gcc -c sub1.c
gcc -c main.c
2.链接为可执行文件
将多个目标文件链接为名为run的可执行文件
gcc main.o sub1.o -o run
3.运行
./run
二、VS2019编译main.c
1.编写main.c和sub1.c文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/7b4e5fb9109c47599f9fad163c260a3d.bmp?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bWM5YWl5byP5bCP55m9,size_18,color_FFFFFF,t_70,g_se,x_16#pic_center)
![使用extern关键字声明](https://img-blog.csdnimg.cn/511b5fd800bc478bbe0c3aee1f127af0.bmp?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bWM5YWl5byP5bCP55m9,size_18,color_FFFFFF,t_70,g_se,x_16#pic_center)
使用c语言中extern关键字声明*x2x()*是来自外部其他c程序所定义的函数。
2.执行程序
![在这里插入图片描述](https://img-blog.csdnimg.cn/83b1de204a624060a04669d9f539af3c.bmp#pic_center)
三、Makefile方式
1.规则
target... : prerequisites ...
command
...
...
-------------------------------------------------------------------------------
target也就是一个目标文件,可以是Object File,也可以是执行文件,还可以是一个标签。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
而Makefile文件就是将上述编译步骤写进一个文件,在makefile文件中遵守上述规则,就可以使用make命令生成最后的可执行文件,一步到位。
2.创建makefile文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/7b25714729914db4a80adcb5728852af.bmp?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bWM5YWl5byP5bCP55m9,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
使用vim编辑器创建一个makefile文件,并在文件中输入gcc命令行模式对应的操作,编辑完成后保存退出。
最后clean是如果不需要生成的目标文件和可执行文件,使用make clean 即可删除。
3.运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/34e09e3c705f48e88be0223ed8aa58dd.bmp#pic_center)
使用make clean 删除命令
![在这里插入图片描述](https://img-blog.csdnimg.cn/3962e145b8fa476a887db17fed0566c4.bmp#pic_center)