编写C代码
编辑器:vim
,编写.c
文件
编译
gcc 源文件 -o 生成可执行文件名
gcc -c
:只编译,不链接,生成.o
文件
make工具和Makefile文件
make工具:GNU make,是一个文件,用于将源代码编译为可执行的二进制文件
Makefile:make工具使用的文件,指明编译和链接规则
使用gcc编译多个文件时,每次编译都需要重新全部编译、链接,文件多的时候效率很低
需要一个工具
- 如果工程没有编译过,那么所有
.c
文件都被编译、链接成可执行文件 - 如果工程中只有若干
c
文件被修改,那么编译这些被修改的即可 - 如果头文件被修改,那么编译所有引用这个头文件的
c
文件,并且链接
例如以下多个文件:
工程里增加一个Makefile
文件
- 名字必须是
Makefile
- 格式。命令前必须是
Tab
目标文件:来源文件
命令
...
...
clean:
清除命令
使用make
命令,编译。最后make clean
,清理编译出的文件
Makefile基本语法
1. 规则格式
目标文件... : 依赖文件集合...
命令1
命令2
....
所有规则中,第一条的目标为默认目标,只要默认目标更新,那么就认为Makefile的工作,完成整个Makefile就是为了完成这个工作
2. Makefile变量
只有字符串格式
- 使用变量:
$(变量名)
objects = main.o input.o caclcu.o
main : $(objects)
一些符号
=
:相当于起别名,会使变量一直跟踪变化
a = name
b = $(a)
a = name1
// 此时b=name1
:=
:相比于=
,不会使用后面定义的变量,上例结果会是b=name
?=
:如果前面没有赋值,那么赋值,否则使用前面的+=
:字符串末尾追加
3. 模式规则、自动化变量
通配符:%
。例如一系列main.o : main.c
可以换成一条%o : %.c
命令中必须配合自动化变量使用。
$@
:规则中的目标集合$<
:依赖文件集合中的第一个文件,如果依赖文件是模式定义的(%
),那么就是符合模式的一系列文件集合$^
:所有依赖文件的集合,用空格分开
4. 伪目标
例如上面的例子,clean
没有依赖文件,make clean
总是会执行,但如果工程下有clean
文件,那么就出问题了,需要声明为伪目标
.PHONY : 伪目标名
.PHONY : clean
clean:
rm *.o
rm main