C语言-gcc

GCC

  1. gcc(GNU Compiler Collection),是GNU组织为了编译Linux内核代码而开发一款C语言编译器,现在还支持c++、java等语言。

  2. gcc编译程序的主要过程

    • 预处理(Pre-Processing)

      将.c代码进行预处理,主要处理源文件的预处理指令

      # 生成以.i结尾的预处理文件 可指定生成文件名
      gcc -E hello.c <-o hello.i>
      
    • 编译 (Compiling)

      将上一步的.i文件转换成.s汇编代码

      # 生成以.s结尾的汇编文件
      gcc -S hello.i<-o hello.s>
      
    • 汇编 (Assembling)

      将上一步的.s文件翻译成二进制指令

      # 会生成以.o结尾的目标文件
      gcc -c hello.s <-o hello.o>
      # 也可直接省略上两步,直接-c生成目标文件
      
    • 链接 (Linking)

      将若干目标文件、库文件等链接起来生成可执行文件

      # 默认会生成a.out可执行文件
      gcc a.o b.o c.o ... 
      
      # 也可以使用-o指定可执行文件的名字。
      gcc hello.o -o hello
      
      # 执行程序
      ./hello 
      
      # 编译执行:
      gcc a.o b.o c.o && ./a.out
      

    粗略演示。。。
    C语言-gcc_第1张图片
    生成的hello.i文件(可以看到添加了很多命令)
    C语言-gcc_第2张图片

生成的hello.s汇编文件
C语言-gcc_第3张图片
生成的目标文件打开是乱码(不过我们不是机器,估计也看不懂吧哈哈,这里就不作演示)

  1. gcc常用参数

    选项 说明
    -E 预处理
    -S 生成汇编文件
    -c 生成目标文件
    -o 设置编译结果的名字(.i/.s/.o)
    -I(大写i) 设置要导入的头文件的路径
    -l(小写L) 设置要链接的库名,例如:使用sqrt、pow等数学函数时就需要链接数学库 -lm
    -L 设置要链接的库的路径
    -D 在编译时定义宏
    -g 编译时添加调试信息,这样编译出的程序可以用gdb调试。
    -Wall 显示所有警告,编译器会以更严格的标准检查代码
    -Werror 把警告当错误处理
    -std 指定编译器要遵循的语法标准,c89,c99,c11,当前使用系统默认的是c99标准。
  2. 文件类型

    .h 头文件,里面是一些对.c文件的说明
    .c 源文件,里面是一些功能型代码
    .i 预处理文件
    .s 汇编文件
    .o 目标文件
    .gch 头文件的编译结果,用于检查自定义的头文件是否有语法错误,建议立即删除
    .a 静态库文件,相当Windows系统下的.lib文件
    .so 动态库文件,相当Windows系统下的.dll文件
    

你可能感兴趣的:(C语言,c语言)