(一)GCC
GCC编译流程分为四个阶段:
预处理(Pre-Processing)::gcc–E hello.c–o hello.i
编译(Compiling):gcc–S hello.i–o hello.S
汇编(Assembling):gcc–c hello.S–o hello.o
链接(Linking):gcchello.o–o hello
GCC通过后缀来区别输入文件的类别:
.c为后缀的文件:C语言源代码文件
.a为后缀的文件:是由目标文件构成的库文件
.C,.cc或.cpp为后缀的文件:是C++源代码文件
.h为后缀的文件:头文件
.i为后缀的文件:是已经预处理过的C源代码文件
.ii为后缀的文件:是已经预处理过的C++源代码文件
.o为后缀的文件:是编译后的目标文件
.s为后缀的文件:是汇编语言源代码文件
.S为后缀的文件:是经过预编译的汇编语言源代码文件
3、总体选项
-c 只是编译不链接,生成目标文件“.o”
-S 只是编译不汇编,生成汇编代码-E只进行预编译,不做其他处理
-g 在可执行程序中包含标准调试信息(用于GDB调试)
-o file指定输出文件为file
-v 打印出编译器内部编译各过程的命令行信息和编译器的版本
-static 链接静态库
-I dir在头文件的搜索路径列表中添加dir 路径eg: gcc–I /home/student/include test.c–o test
-L dir在库文件的搜索路径列表中添加dir 路径
-lname 链接名为libname.so的库文件eg: gcc–L /home/student/lib –lmylib test.c–o test
警告和出错选项
-ansi 输出符合ANSI C标准语法的警告信息
-pedantic 允许发出ANSI C 标准所列的全部警告信息
-Wall 允许发出GCC 提供的所有有用的警告信息
-w 关闭所有警告信息
-Werror 把所有的告警信息转化为错误信息,并在警告发生时终止编译过程
****制作库文件
gcc -shared -o libsub.a sub.o
(二)makefile: 一般被叫做“makefile”或“Makefile”。当然你可以 在 make 的命令行指定别的文件名。如果你不特别指定,它会寻 找“makefile”或“Makefile”,因此使用这两个名字是最简单 的。
VPATH = src:../headers
OBJS = foo.o bar.o //定义变量
CC = gcc
CFLAGS = -Wall -O -g
myprog : $(OBJS)
$(CC) $(OBJS) -o myprog //$引用变量后,命令为gcc foo.o bar.o -o myprog
foo.o : foo.c foo.h bar.h
$(CC) $(CFLAGS) -c foo.c -o foo.o
bar.o : bar.c bar.h
$(CC) $(CFLAGS) -c bar.c -o bar.o
#假象目的 注释
.PHONY :clean
clean :
rm *.o
=== makefile 结束 ===
# :代表后面的东西是注释语句
变量:一般为大写,通过 = 赋值,然后通过 $ 引用该变量
$(变量名)
变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有“:”、“#”、“=”或是空字符(空格、回车等)
FOO ?= bar
其含义是,如果FOO没有被定义过,那么变量FOO的值就是“bar”,
变量值的替换。
“$(var:a=b)”或是“${var:a=b}”:把变量“var”中所有以“a”字串“结尾”的“a”替换成“b”字串
三个 比较有用的变量是 $@, $< 和 $^ (这些变量不需要括号括住)。
$@ 扩展成当前规则的目的文件名,
$< 扩展成依靠列表中的第 一个依靠文件
$^ 扩展成整个依靠的列表(除掉了里面所有重 复的文件名)。
标 明所有的假象目的(用 .PHONY),这就告诉 make 不用检查它们 是否存在于磁碟上,也不用查找任何隐含规则,直接假设指定的目 的需要被更新。
格式说明:
1、
目标 : 关联文件
tab键 命令
2:自动推导
insert.o : defs.h buffer.h
等价于
insert.o : insert.c defs.h buffer.h
gcc -c insert.o insert.c
3:makefile中使用变量
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
提取变量:$(objects)
特殊变量 VPATH:用于指定查找依赖文件的目录
VPATH = src:../headers
4:伪目标
.PHONY : clean
clean :
rm edit $(objects)
.PHONY 用于为了避免和文件重名
5:条件表达式
ifeq、else和endif
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
6、函数的调用语法
$(
函数的调用语法