深入理解C编译过程:从初学者到专家

1:先看图

2:一个C++源文件从文本到可执行文件经历的过程: gcc  Hello.cpp

  1. 预处理阶段:gcc -E hello.c  -o hello.i     对源代码文件中包含关系(头文件),预编译语句(宏定义)进行分析和替换,生成预编译文件。
  2. 编译阶段:gcc -s hello.i   -o  hello.s    将经过预处理后的预编译文件转换成特定汇编代码(编译原理相关,词法分析,语法分析,语义分析等),生成汇编文件。
  3. 链接阶段: gcc hello.o -o hello    将多个目标文件及所需要的库打包连接成最终的可执行目标文件(或库文件以供其他程序使用)

3:.c  .cc   .cpp 和 .h  .hpp  .inl 这些后缀名都有什么区别 

  1. C中:头文件后缀名 .h, 源文件后缀名 .c
  2. C++ 中: 头文件后缀名 .h  .hpp .hxx  ,源文件后缀名为:  .cpp    .cc  .cxx  
  3. .h和.hpp  的区别: *.h  里面只有声明,没有实现, 而 *.hpp 里面既有声明也有实现,后者可以减少 .cpp 数量,适合用来编写公用的 开源库
  4. inl 文件是 内联函数的源文件,内联函数通常在 C++头文件中实现,但有的时候,内联函数较多或者出于一些别的考虑(比如:头文件看起来更加简洁)往往会将这部分具体定义的代码添加到  INL文件中,然后在该头文件的末尾将其用  #include 引入。 由此也可以看到  inl 文件的一个用法影子  ——模板函数,模板类的定义的代码的存放。

4:gcc 和g++ 区别 

  • 简单来说:gcc 和g++都是 GNU组织的一个编译器,都可以编译C代码与 C++代码。但是,后缀为 .c的, gcc 把它当做 C程序,而g++当做 C++程序;后缀为 .cpp 的,两者都会认为是 C++程序。
  • 编译阶段:g++会调用gcc ,对于C++代码,两者是等价的,但是因为gcc 命令不能自动和C++程序使用的库联接,所以通常使用 g++来完成链接
  • gcc 编译cpp 可以使用命令:  gcc main.cpp -lstdc++
  • 5: 静态链接,动态链接具体做了什么 

  • 静态链接是在形成可执行程序前,而动态链接的进行则是在程序执行时链接
  • 静态链接浪费空间,这是由于多进程情况下,每个进程都要保持静态链接函数的副本,更新困难,当链接的众多目标文件有一个改变后,整个程序都要重新链接才能使用新的版本,但是静态链接运行效率高。
  • 动态链接当系统多次使用同一个目标文件时,只需要加载一次即可,节省内存空间,程序升级变得容易,当升级某个共享模块时,只需要简单的将旧目标文件替换掉,程序下次运行时,新版目标文件会被自动装载到内存并链接起来,即完成升级
  • 静态链接时以目标文件为单位,将各个目标文件连接起来形成可执行文件
  • 动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将他们链接在一起形成一个完成的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。
  • 物联沃分享整理
    物联沃-IOTWORD物联网 » 深入理解C编译过程:从初学者到专家

    发表评论