Bootstrap

Linux C编程

编写C代码

编辑器:vim,编写.c文件

编译

  • gcc 源文件 -o 生成可执行文件名
    请添加图片描述
    gcc -c:只编译,不链接,生成.o文件

make工具和Makefile文件

make工具:GNU make,是一个文件,用于将源代码编译为可执行的二进制文件
Makefile:make工具使用的文件,指明编译和链接规则

使用gcc编译多个文件时,每次编译都需要重新全部编译、链接,文件多的时候效率很低
需要一个工具

  1. 如果工程没有编译过,那么所有.c文件都被编译、链接成可执行文件
  2. 如果工程中只有若干c文件被修改,那么编译这些被修改的即可
  3. 如果头文件被修改,那么编译所有引用这个头文件的c文件,并且链接

例如以下多个文件:

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
工程里增加一个Makefile文件

  1. 名字必须是Makefile
  2. 格式。命令前必须是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

命令中必须配合自动化变量使用。

  1. $@:规则中的目标集合
  2. $<:依赖文件集合中的第一个文件,如果依赖文件是模式定义的(%),那么就是符合模式的一系列文件集合
  3. $^:所有依赖文件的集合,用空格分开

4. 伪目标

例如上面的例子,clean没有依赖文件,make clean总是会执行,但如果工程下有clean文件,那么就出问题了,需要声明为伪目标

.PHONY : 伪目标名

.PHONY : clean
clean:
	rm *.o
	rm main
;