1、configure文件
configure文件可以自动配置源代码以适应各种不同平台上Linux系统的特性,根据系统参数及环境产生合适的Makefile文件和C的头文件,让源代码可以很方便地在不同的平台上被编译
2、gcc常用选项
-Idir | 将头文件的搜索路径扩大,包含dir目录 |
-Ldir | 将链接时使用的链接库搜索路径扩大,包含dir目录。gcc都会优先使用共享程序库 |
-static | 仅选用静态程序库进行链接,如果一个目录中静态库和动态库都存在,则仅选用静态库 |
-g | 包括调试信息 |
-On | 优化程序,程序优化后执行速度会更快,程序的占用空间会更小。通常gcc会进行很小的优化,优化的级别可以选择,即n。最常用的优化级别是2 |
-Wall | 打开所有gcc能够提供的、常用的警告信息 |
3、Makefile文件
Make工具最主要也是最基本的功能就是通过Makefile文件来描述源程序之间的相互关系并自动维护编译工作,make如果没有“-f”参数,则系统将默认当前目录下名为makefile或者Makefile的文件为描述文件。在Linux系统中,GUN make工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜素makefile文件
4、伪目标
如果命令行中没有指定伪目标,则系统默认“target”指向描述文件中第一个伪目标,一般第一个伪目标为“all”
clean伪目标,可用来清除编译过程中的中间文件
distclean,除删除编译过程中产生的中间文件外,还可以将生成的Makefile文件一并删除
install 可以将生成的可执行文件和其他相关的文件安装到“prefix”选项所定义的安装路径,即通常意义上的“安装”软件
uninstall 可以将可执行文件和其他相关的文件从安装路径上删除,即通常意义上的“卸载”软件
5、Makefile中的预定义变量
变量名 | 含义 | 默认值 |
CC | C语言编译器的名称 | cc |
RM | 删除文件程序的名称 | rm -f |
CFLAGS | C语言编译器的编译选项 | 无默认值 |
变量 | 含义 |
$< | 表示依赖项中第一个依赖文件的名称 |
$@ | 目标项中目标文件的名称 |
$^ | 依赖项中,所有不重复的依赖文件,这些文件之间以空格分开 |
后缀规则:定义如何将一个具有特定文件名后缀的文件(如.c文件)转换成为具有另一种文件名后缀的文件(如.o文件)
模式规则:模式规则看起来非常类似于正则规则,但在目标名称前面多了一个“%”号
自动推导规则:使用命令make编译扩展名为.c的C语言文件的时候,源文件的编译规则不用明确给出。这是因为make进行编译的时候会使用一个默认的编译规则,按照默认规则完成对.c文件的编译,生成对应的.o 文件。
hello.c
int main(void) { printf("hello world") ; return 0 ; }
Makefile
hello : hello.c gcc -o hello hell.cMakefile 改进 把编译和链接分开
hello : hello.o gcc -o hello hello.o 链接 hello.o : hello.c gcc -o hello.o -c hello.c 编译 -c表示只编译不链接Makefile再次改进,使用模式匹配
hello : hello.o gcc -o $@ $^ //目标可以用$@表示,所有的依赖可以用$^表示 gcc -o hello hello.o %.o : %.c //hello.o : hello.c gcc -o $@ -c &< //目标可以用$@表示,第一个依赖可以用$<表示 gcc -o hello.o -c hello.c clean : rm *.o hello
Makefile再次改进,使用变量
CFLAGS = -O2 OBJS = hello.o TARGET = cacu $(TARGET) : $(OBJS) $(CC) -o $@ $^ $(CFLAGS) $(OBJS) : %.o : %.c $(CC) -o $@ -c $< clean: $(RM) $(TARGET) $(OBJS)