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”的内容。

 

原文地址:https://www.cnblogs.com/tjy1805099/p/12619771.html