工具gcc/g++和make
1. gcc/g++
在linux中,当我们写了C/C++的代码需要编译的时候,就需要用到linux中C/C++特有的编译器:gcc/g++
因为gcc和g++的用法几乎是相同的,只是编译的代码一个是C语言一个是包含C语言的C++语言罢了.
值得注意的是,在Linux中,C++ 代码文件的后缀名通常有 .cpp .cc 和 .cxx 这三个
1. gcc的使用
当我们写了一个C语言文件test.c时,想要使用gcc进行对代码的编译,可以直接使用语句 gcc test.c
gcc test.c
执行完本句后可以看到当前目录下多了一个a.out 文件
此时直接执行语句
./a.out
就可以看到代码执行结束的内容了
2. gcc的编译过程
C语言的的编译一般分为以下几个阶段
- 预处理(进行宏替换)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 连接(生成可执行文件或库文件)
下面是gcc的编译步骤和操作
格式 gcc [选项] 要编译的文件 [选项] [目标文件]
预处理(进行宏替换)
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查
无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc –S hello.i –o hello.s
汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o
连接(生成可执行文件或库文件)
在成功编译之后,就进入了链接阶段。
实例: gcc hello.o –o hello
此时生成的可执行程序 mybin 就是和通过 gcc 直接编译的 a.out 是同样的目标文件了
执行语句 ./mybin
即可得到与./a.out相同的程序运行结果了
2. Linux项目自动化构建工具make/Makefile
背景
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的
规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂
的功能操作
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编
译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命
令.
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
依赖关系
比如说有一个文件 hello ,它依赖 hell.o进行gcc -o 编译后才能得到
hello.o , 它依赖 hello.s 进行 gcc -c 编译后才能得到
hello.s , 它依赖 hello.i 进行 gcc - S 编译后才能得到
hello.i , 它依赖 hello.c进行 gcc -E 编译后才能得到
使用方法
首先我们有一个源文件test.c
然后用vim创建一个Makefile文件并直接进入编辑
vim Makefile
此时我想要使test.c直接生成可执行的mybin文件即可输入
mybin:test.c // : 左边是目标生成文件, 右边是依赖文件 下一行是执行语句
@gcc test.c -o mybin // 前面加@是直接显示执行语句的结果不显示执行语句
.PHONY:clean //.PHONY是指伪目标,即无视文件内容或属性的更改时间并总在执行的语句
@rm -f mybin
写完以上代码后保存并退出
然后执行语句
make
即可得到目标文件
再使用语句
make clean
即可删除目标文件
最终版本:多文件下的Makefile写法
我们知道,每一个项目都是有很多个头文件和源文件的,但我们想要一起编译时,Makefile就需要用到更高级的写法
语法:
想要生成的目标文件 : 依赖文件
gcc -o $@ $^ //注意 $@ 指的是上面语句中 : 左边要生成的目标文件, $^指的是 : 右边所有的依赖文件
当我们有一个头文件一个源文件时,如下;
此时的Makefile文件的写法如下:
cc = gcc g++ //这里搞定gcc和g++
src = test.c test.h //这里输入所依赖的所有文件
target = mybin //这里输入想要生成的目标文件
$(target):$(src)
@cc -o $@ $^
.PHONY:clean
clean:
@rm -f $(target)
然后保存退出后执行语句
make
即可生成目标文件
执行目标文件:
再执行语句
make clean
即可删除目标文件
完结~❀❀❀