个人主页:点我进入主页
专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C++初阶 算法
欢迎大家点赞,评论,收藏。
一起努力,一起奔赴大厂
目录
一.gcc/g++安装
二.gcc运行代码
三.gcc是如何完成的
3.1预处理
3.2编译
3.3汇编
3.4链接
四.makefile自动化构建
4.1背景
4.2简单的makefile文件
4.3如何使用我们的makefile
4.4.PHONY:的用处
4.5利用变量编写makefile
一.gcc/g++安装
在使用这个之前我们需要先进行gcc/g++的安装,当我们不是root账户时我们输入指令:
sudo yum -y install gcc gcc-c++ autoconf make
当我们是root指令时我们输入指令
yum -y install gcc gcc-c++ autoconf make
当我们安装好后我们输入指令
gcc -v
我们可以看到我们的版本信息。
二.gcc运行代码
我们先写一段代码
#include<stdio.h>
int main()
{
printf("Hello Linux\n");
printf("Hello Linux\n");
printf("Hello Linux\n");
printf("Hello Linux\n");
return 0;
}
我们保存退出后,输入指令
gcc test.c
我们可以看到
会生成一个a.out可执行程序,当然我们可以使用-o选项进行重命名如下:
gcc test.c -o test.exe
我们运行可执行程序时需要输入指令
./test.exe
三.gcc是如何完成的
3.1预处理
我们的c语言代码在生成可执行程序时会先经过预处理阶段,预处理阶段是将头文件展开,宏替换,条件编译,注释替换这些过程,我们看下面代码:
#include<stdio.h>
#define MAX 3
int main()
{
#if 1==1
int a=MAX;
printf("%d\n",a);//条件
#elif 0
printf("elif\n");
#else
printf("else\n");
#endif
return 0;
}
我们想看我们的预处理阶段产生的代码我们可以输入指令
gcc -E test.c -o test.i
我们利用vim打开我们的test.i
我们可以看到有800多行,其中的头文件展开导致出现了800多行,我们定义的宏MAX被替换为了3,我们的注释被替换为了空格,条件编译是只保留了有效的部分。注意预处理阶段不会减产代码的方法错误,例如我们将printf后面的分号去掉我们依旧可以指向我们的预处理
3.2编译
我们生成可执行程序时经过预处理阶段后就会进入编译阶段,编译阶段就是检查代码是否有语法错误,是否规范,没有错误后生成汇编代码。我们想要进行编译阶段需指令
gcc -S test.i -o test.s
由于上面我们将代码进行修改我们可以看到
所以在编译阶段会对代码进行语法是否有错误,我们修改后再输入指令然后用vim打开tes.s文件可以看到;
这里面的信息就是我们的汇编代码。
3.3汇编
汇编阶段就是将程序生成二进制代码,我们输入指令然后用vim进行查看test.o的内容
gcc -c test.s -o test.o
3.4链接
链接就是生成可执行程序,如果我们有多个文件还会进行符号表的合并,我们输入指令
gcc test.o -o test.exe
我们运行test.exe文件
四.makefile自动化构建
4.1背景
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。ake是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
4.2简单的makefile文件
首先我们先创建一个文本makefile(名字),然后用vim进行编译,文本的内容如下:
test.exe:test.c
gcc test.c -o test.exe
.PHONY:
clean:
rm -rf test.exe
我们对其进行逐行分析,在第一行中test.exe是目标文件,test.c是依赖文件,整体的test.exe:test.c是依赖关系,第二行gcc test.c -o test.exe是依赖方法,第三行先不解释,第四行是依赖关系,第五行是依赖方法。
4.3如何使用我们的makefile
我们输入make是默认执行第一个依赖方法
make
我们看到它自动转换为我们的第一条依赖方法,那如何执行我们的第二条依赖方法呢?我们输入
make clean
就会自动生成我们的抵赖方法。
4.4.PHONY:的用处
我们的第一个依赖关系前没有.PHONY:第二条依赖关系有.PHONY:这个有什么用处呢?我们看我们连续输入两次make可以看到:
、
我们第二次就不能再执行了,但是我们连续两次输入make clean可以看到
它依旧可以生成,我们猜测它有一种机制来检查是否可以使用,而.PHONY:就是将这个检查机制进行关闭,事实上是根据修改时间来确定的。我们重新生成一个test.exe
我们输入
stat test.exe
这个就是根据比较我们的Modify的时间和test.exe的时间是否相同,相同就不会执行不同就会执行,而.PHONY就是无论相不相同都会执行。
4.5利用变量编写makefile
cur=test.exe
src=test.c
$(cur):$(src)
gcc $(src) -o $(cur)
.PHONY:
clean:
rm -rf $(cur)
注意等于两边没有空格。