嵌入式Linux编译器gcc使用

2019-07-12 22:36发布

from: http://blog.csdn.net/jyjmc/article/details/5278130
At first, GCC is used for GNU C Compiler. At present,it supports JAVA Ada C++ and so on.   GCC编译流程分为:
1.Pre-Processing(预处理)    gcc -E -o hello.i hello.c
   选项-E  使得编译器在预处理结束时停止编译
   选项-o   指定GCC的输出结果
   .i/.ii       经过预处理的C/C++源程序

2.Compiling(编译)
   gcc -S -o hello.s hello.i
   选项-S   使得编译器在编译结束,进行汇编之前停止编译
   .s          汇编语言源程序

3.Assembling (汇编)
   gcc -c hello.s hello.o
   选项-c     汇编阶段将汇编代码转为二进制目标代码

4.Linking(链接)
   gcc hello.o -o hello
   将程序中用到的库函数如printf的实现从默认的路径"/usr/lib/libc.so.6"链接过来    现在即可运行可执行文件hello        GCC警告提示:   1.Wall类警告提示
   占GCC警告选项90%以上,建议使用选项-Wall,即打开所有警告:
   gcc -Wall wrong.c -o wrong
2.非Wall类警告提示
   "-ansi"   强制GCC生成的标准语法所要求的告警信息,并不保证所有没有警告的程序都是符合ANSI C标准
   ”-pedantic“ 允许发出ANSI C标准所列的全部警告信息,保证所有没有警告的程序都是符合ANSI C标准       gcc -pedantic wrong.c -o wrong  
GCC使用库函数
Linux中有3种库函数形式:
1.静态 后缀为.a
   静态库的代码在编译时就已经连接到应用程序中      2.共享 后缀为.so和版本号
   在程序开始运行时才载入   3.动态 后缀为.so和版本号
  在程序中的语句需要使用该函数时才调用,调用结束后释放动态库所占内存     动态库和共享库只包含对库函数的引用,代码规模较小
  Linux系统所用的库都放在 /usr/lib 和 /lib 目录下

  库文件的路径通常不在系统默认路径下,则需要使用调用路径选项来指定相关库文件的位置
  1. ” -I dir “   在头文件的搜索路径列表中添加 dir 目录
      若"/root/workplace/gcc"下包括hello.h , hello.c:
      "# include ..."

      gcc hello.c -I /root/workplace/gcc -o hello
      <>表示在系统默认路径中搜索头文件,采用#include ”hello.h“则不用加 -I选项

  2. ”-L dir“ 与-I dir类似,区别在于”-L“指明库文件的路径
       dir中不能包括文件名,只是指定了路径    
  使用3种类型链接库
  用选项”-l“(小写的L)加库名称,如libm.a或libm.so 在调用时都写作”-lm“
  Linux系统默认采用动态链接的方式 ,若动态静态库重名,则需要显示包含后缀"-llibm.a"

  GCC代码优化: -On选项 n常取0~3 n越大优化工作越多  
  优化选项可以加速代码运行速度,但加大调试难度。一般在最终release的时候考虑优化     以上为《嵌入式LinuxC编程入门(第二版)》ISBN 978-7-115-21281-8  学习整理