zoukankan      html  css  js  c++  java
  • 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”的内容。

     

  • 相关阅读:
    《SPFA算法的优化及应用》——姜碧野(学习笔记)
    hdu 4691 Front compression
    hdu 4690 EBCDIC
    UVA 11478 Halum(用bellman-ford解差分约束)
    UVA 11090 Going in Cycle!!(二分答案+判负环)
    UVA 10537 The Toll! Revisited uva1027 Toll(最短路+数学坑)
    hdu 4674 Trip Advisor(缩点+倍增lca)
    canny算子原理
    二值图像连通区域标记
    C++全局变量的声明和定义
  • 原文地址:https://www.cnblogs.com/tjy1805099/p/12619771.html
Copyright © 2011-2022 走看看