一个C程序的编译过程(Linux环境下GCC)



一 以下是C程序一般的编译过程:


 

 从图中看到:

      将编写的一个c程序(源代码 )转换成可以在硬件上运行的程序(可执行代码 ),需要进行编译阶段  和链接这两个阶段。

      其中,

      1.  编译阶段先通过“编译器 “把一个 .c / .cpp 源代码 编译成 .s的汇编代码 ;再经过“汇编器 ” 把这 个.s的汇编代码汇编成 .o 的 目标代码

      2.  “连接器 “ 通过连接其他 .o 代码(如果需要的话) 库文件 和 1 中的.o 目标代码生成可执行文件

该文件流被这三种程序(红色)的加工,分别表现出四种形式(蓝色) ,这就是c程序的编译和链接过程。如果再详细的话,编译器在将源文件编译成汇编文件的过程又分为:预处理阶段(生成 .i代码 ) 和  优化阶段

 


二、C编程中的文件后缀名介绍

    .c 未经过预处理的C源码
    .h C头文件  
    .i 经过预处理的C源码

    .s 生成的汇编语言代码 
    .o 编译之后产生的目标文件
    解释:

*.c一般使我们自己编辑的代码,是我们劳动的结晶;

*.h一般是我们手工生成的接口文件,也可在*.c完成后用GCC的选项-aux-info帮我们生成;

*.i是经过预处理后的源码,是由GCC在选项-E编译下自动生成的文件;

*.o是编译后产生的目标文件;

*.s是GCC在选项-S编译下生成的汇编语言代码,对于性能要求很高的程序可以先生成汇编语言文件并对汇编做优化,然后用优化后的汇编生成目标文件并链接

 


三 演示 hello.c 的编译 过程(Linux 下 Gcc)

    

         本小节的演示都针对文件 hello.c 进行

   1. /*
   2.  * hello.c
   3.  */
   4.
   5.   #include <stdio.h>
   6.   int  main()
   7.   {
   8.     printf("
 
Better goal, Better life! /n");
   9.     return 0;
  10.   }


  1.生成预处理后的文件 hello.i

     gcc -E hello.c -o hello.i

  2 .生成汇编语言文件 hello.s

      gcc -s hello.i -o hello.s

   3.生成目标文件 hello.o

      $ gcc -c hello.i
      $ gcc -c hello.s

   4. 生成可执行文件

      $ gcc -o hello hello.o

   5. 运行及结果

      $ ./hello

      Better goal, Better life!

当然也可以直接生成, $ gcc -c hello.c  就可以生成可执行文件。这是Gcc内部的事。但就算是跳跃也要经过一步步的翻译, 原理是相似的,万变不离其宗!





参考二:


l          Linux 下编写普通可执行文件的命令:

gcc –o 目标文件名 源文件名(列表)

如果工程包含多个 .c 和 .h 那么在源文件名列表中只列出所有的 .c 文件

例:工程文件夹里有 des.c  hash.c  main.c  des.h  hash .h 要将他们编译成 EncApp 可执行文件,则使用下面的命令

    gcc  –o  EncApp  des.c  hash.c  main.c

l          Linux 下编写调用动态库或静态库的可执行文件的命令:

gcc –o 目标文件名 源文件名(列表)库文件名(列表)

如果工程包含多个 .c 和 .h 那么在源文件名列表中只列出所有的 .c 文件和库文件

例:工程文件夹里有 main.c  enc.so 要将他们编译成 EncApp 可执行文件,则使用下面的命令

gcc  –o  EncAp  main.c  enc.so

注意: .so 文件必须事先复制到 /usr/lib 目录下

l         生成静态库需要的命令

生成静态库 .a 必须先生成 目标文件 .o 然后再生成静态库 .a

生成目标文件的命令格式为:

gcc  –c  –o  目标文件名 .o   源文件名 .c (列表)

生成静态库的命令格式为:

ar  –r  静态库文件名 .a   目标文件名 .o

l         生成动态库需要的命令

生成动态库 .so 必须先生成 目标文件 .o 然后再生成动态库 .so

生成目标文件的命令格式为:

gcc  –fpic  –c  –o 目标文件名 .o  源文件名 .c (列表)

生成动态库的命令格式为:

gcc  –shared  –o  动态库文件名 .so  目标文件名 .o

l    备注:在编译可执行文件,各种目标文件和库文件的时候,用到的 .h 文件必须在编译文件夹下,如果没有这些头文件,编译器将报错。



FROM: http://blog.youkuaiyun.com/cybertan/article/details/5372692

     http://blog.youkuaiyun.com/gengyichao/article/details/6544266


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值