C++:C++编译过程:看完还不懂C++编译过程来捶我

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

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 文件的一个用法影子  ------模板函数模板类的定义的代码的存放。

4gcc 和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: 静态链接动态链接具体做了什么 

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: c++

“C++:C++编译过程:看完还不懂C++编译过程来捶我” 的相关文章