GCC学习笔记(二):编译选项
GCC的基本用法:
gcc [选项] 文件名
GCC的编译选项:
GCC后面有很多编译控制选项,使得GCC可以根据不同的参数进行不同的编译处理,可供GCC调用的参数大约有100多个,但实际常用并不多,这里简单的总结一下,以方便使用。
- -Dmacro: 相当于C语言中的#define macro
- -Dmacro=defn: 相当于C语言中的#define macro=defn
- -Idirname : 将dirname目录添加到程序头文件搜索列表中,是在预编译过程中使用的参数
- -On : “O”是大写,对程序进行优化编译,链接,n可取值为0、1、2、3;O0没有优化等级,O3优化等级最高,采用这个选项,整个源代码会在编译,链接过程中进行优化处理,这样产生的可执行文件是执行效率可以提高,但是编译,链接的速度就相应的要慢一些
- -g : 产生符号调试工具(GNU的gdb)所必需的符号信息,要想对源代码进行调试,就必需加入这个选项,g也分等级,默认是-g2,-g1是最基本的,-g3包含宏信息
- -w : (小写)关闭所有警告,不建议使用
- -W : (大写)开启所有gcc能提供的警告
- -c : 只编译不链接,编译器只是将输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件
- --sysroot=dir将dir作为逻辑根目录。比如编译器通常会在 /usr/include 和 /usr/lib 中搜索头文件和库,使用这个选项后将在 dir/usr/include 和 dir/usr/lib 目录中搜索
- -S : 只对文件进行编译,不汇编和链接
- -E : 只对文件进行预处理,不编译汇编和链接
- -o filename : 确定输出文件的名称为filename,这个名称不能我源文件同名,如果不给了这个选项,gcc就给出预设的可执行文件a.out
- -l FOO : 链接名为libFOO的函数库
- -static : 链接静态库
- -ansi : 支持ANSI/ISO C的标准语法,取消GNU语法中与该标准相冲突的部分
- -werror : 将所有警告转换为错误,开启该选项,遇到警告都会中止编译
- -v : 显示gcc执行时的详细过程,GCC及其相关程序的版本号。
- -Idir :在您是用#include"file"的时候,gcc/g++会先在当前目录查找您所定制的头文档,假如没有找到,他回到缺省的头文档目录找,假如使用-I定制了目录,他回先在您所定制的目录查找,然后再按常规的顺序去找
- -M:生成文件的依赖关系,同时也把一些标准库的头文件也包含了进来
- -MM:生成文件的依赖关系,和 -M 类似,但不包含标准库的头文件
GCC的编译规则举例:
变量定义
CROSS_COMPILE = arm-none-eabi- CC = $(CROSS_COMPILE)gcc CFLAGS = -g
建立一个测试目录test,在测试目录下建立一个名为sub的子目录;在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2 个文件
1、准备源文件合集:变量SRC
SRC=$(wildcard *.c ./sub/*.c)
等于指定编译当前目录及子目录sub下所有.c文件,合集命名为SRC。
其结果:a.c b.c ./sub/sa.c ./sub/sb.c
准备源文件合集:去掉变量SRC中的路径
dir=$(notdir $(SRC))
其结果:a.c b.c sa.c sb.c
2、准备.o文件合集:变量OBJ
obj=$(patsubst %.c,%.o,$(dir) )
patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o
或:obj=$(dir:%.c=%.o)
其结果:a.o b.o sa.o sb.o
规则例子1:
CROSS_COMPILE = arm-none-eabi-
CC = $(CROSS_COMPILE)gcc
CFLAGS = -g
objects = foo.o bar.o all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
等价于:
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o
等价规则:“$<”和“$@”则是自动化变量,“$<”表示所有的依赖目标集(也就是 “foo.c bar.c”),“$@”表示目标集(也就是“foo.o bar.o”)
规则例子2:
files = foo.elc bar.o lose.o
$(filter %.o,$(files)): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
等价于:
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o
lose.o : lose.c
$(CC) -c $(CFLAGS) lose.c -o lose.o
等价规则:$(filter %.o,$(files))表示调用Makefile的filter函数,过滤“$filter”集,只要其中模式为“%.o”的内容。