现在的位置: 首页 > 综合 > 正文

gcc编译器

2018年04月17日 ⁄ 综合 ⁄ 共 1577字 ⁄ 字号 评论关闭
(1)GCC主要包括以前一些工具:
   cpp(预处理器)、gcc(c编译器)、g++(c++编译器)等编译器以及binutils等二进制工具.
   其中,binutils是辅助GCC的主要软件,常用的工具有:as(汇编器)、ld(链接器)等.
  
(2)一般来说,面向c程序的gcc编译过程主要分4个阶段:
   1、预处理阶段,完成宏定义和include文件展开等工作.
   2、根据编译参数进行不同程度的优化,编译成汇编代码.
   3、用汇编器将汇编代码进一步生成目标代码.
   4、用连接器将生成的目标代码和系统用户提供的库链接起来,生成可执行文件.
   因此,Linux下的gcc是一个能生成可执行文件的编译器.
  
(3)gcc是符合ISO标准的c编译器,它在需要的时候调用其它组件(预处理器、汇编器和链接器).具体上gcc调用哪些组件是由输入文件的类型和传给gcc的参数决定的.
  
(4)gcc识别的主要文件扩展名:
   .c      c语言代码
   .C,.cc  c++语言代码
   .i      预处理后的c语言代码
   .ii     预处理后的c++语言代码
   .s,.S   汇编语言代码
   .o      目标代码
   .a      静态链接库(程序编译时使用)
   .so     动态链接库(程序运行时使用)
  
(5)gcc编译控制选项
   -E      只运行c预处理器cpp,生成.i文件,并停止工作
   -S      生成汇编代码后输出汇编代码,生成.s文件,并停止工作
   -c      只生成object文件,不链接,生成.o文件,并停止工作
   -o FILE 生成指定的输出文件"FILE",生成可执行文件
   -g      生成被gdb使用的标准调试信息
   -w      不生成任何警告信息
   -Wall   生成所有级别的警告信息
   举例:
   gcc -E hello.c -o hello.i     //只运行c预处理器cpp
   gcc -S hello.i -o hello.s     //生成汇编代码后输出汇编代码
   gcc -c hello.s -o hello.o     //只生成object文件,不链接
   gcc    hello.o -o hello.elf   //生成Linux下的可执行文件hello.elf
   也可一步到位:
   gcc hello.c -o hello.elf      //直接生成Linux下的可执行文件hello.elf
   Attention!!!
   编译选项"-o"(可理解为output)后必须加上生成文件的名字.
   另外,Linux中系统并不识别文件的类型,这只是为了用户理解方便才添加的.
  
(6)gcc优化处理的编译选项
   -O0         不进行代码优化处理
   -O1         进行一般优化,减少大小和时间
   -O2         进一步优化,一般在内核编译时使用(常用)
   -O3         较-O2进一步优化
  
   在Linux中,常用的编译选项是:gcc file.c -o file.elf -Wall -O2
  
(7)gcc在函数库中的应用
   gcc可以编译动态函数库,也可以编译静态函数库.详细使用详见博客"静态链接库和静态链接库".
  
   -I DIR      指定额外的头文件搜索路径DIR
   -L DIR      指定额外的库函数搜索路径DIR
   -l LIBRARY  指定链接时需要的其它函数库"LIBRARY"
   -shared     生成支持动态共享库的执行文件
   -static     不支持动态共享库,把函数库内容静态链接到可执行程序中
 
(8)gcc注意事项
   gcc是本地编译,arm-linux-gcc是交叉编译.两套编译器的编译流程完全一致,只是产生的可执行文件的目标平台不同而已.
【上篇】
【下篇】

抱歉!评论已关闭.