C++基础学习1

一、C\C++程序编译过程:四个阶段

参考链接:

(11条消息) C/C++ 程序编译的四个阶段_wwxy261的博客-CSDN博客_c++文件编译与执行的四个阶段

GCC驱动程序读取源文件.c比如hello.c,并把它翻译成一个可执行目标文件hello,需要经历以下四个阶段,如下图示:

预处理阶段:预处理器(cpp)根据以字符#开头的命令,修改原始的C\C++程序,将.h文件与 .C\.C++ 文件编译成另一个C程序(这个过程也称为预编译),通常是以.i作为文件扩展名。I文件不包含任何宏定义,因为所有宏都已展开,所包含的文件都已插入其中。比如hello.c中第一行的#include<stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中,结果就得到了一个hello.i文件。

编译阶段:编译器(ccl)将文本文件hello.i进行一系列的词法分析、语法分析、语义分析和优化,从而产生相应的汇编语言程序hello.s。汇编语言程序中的每条语句都以一种标准的文本格式确切的描述了一条低级机器语言指令。进行一系列的词法分析、语法分析、语义分析和优化,从而产生相应的汇编代码文件。

汇编阶段:汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种可重定位目标程序的格式,并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言指令而不是字符,如果我们在文本文件中打开hello.o文件,看到的将是一堆乱码。

链接阶段:链接器(ld)负责处理合并目标代码,将一大堆文件链接在一起生成一个可执行目标文件.exe,可以被加载到内存中,由系统执行。在链接过程中,调用其他目标文件中定义的函数的指令需要重新校准,使用其他目标文件中定义的变量的指令也需要重新校准

二、C++静态库与动态库

参考链接:(9条消息) C/C++静态库和动态库的制作、使用、优缺点_干饭小白的博客-CSDN博客_使用动态库的好处

(9条消息) C++笔记 静态库和动态库详解_Love coldplay的博客-CSDN博客_c++静态库和动态库

1、静态库

静态库本质上是由函数和数据编译成的一个二进制文件,可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件,通常在win系统下扩展名为.lib,linux系统下为.a。静态库在程序的链接阶段就复制到程序中,与所有的目标文件及涉及到函数库一同构成可执行文件.exe,在程序运行时不再操作。故静态库本身不需要与可执行文件一起发行。

  • 静态库优点:
  • 方便移植:发布程序的时候,不需要提供对应的库,因为库已经打包到可执行文件中;
  • 代码保密:c++程序即使被反编译也只能还原20%左右。

静态库缺点:

  • 浪费系统空间和资源:库直接被打包到应用程序中,导致.exe的体积很大;
  • 程序的更新、部署、发布十分麻烦:若静态库libxx.lib发生了改变(更新、维护、升级),所有使用它的应用程序都需要重新编译、发布(即对于游戏玩家来说,游戏只是进行了很小的改动,却导致整个游戏需要重新下载,全面更新,这简直糟透了!)。

2、动态库(共享库)

动态库本质也是.o文件的集合,其包含可由多个程序同时使用的代码和数据的库,通常在win系统下扩展名为.dll,linux系统下为.so。动态库在链接阶段只是被记录的一些信息(如文件名),在程序运行阶段才由系统使用动态链接的方式加载到内存中供程序调用。值得注意的是用VC++创建的动态库包含两个文件,一个lib文件和一个dll文件,其中lib文件是引入库(不是静态库),有时也称输入库或导入库。

注:windows操作系统下动态库和运行时库的扩展名都是.dll,COM组件的扩展名也是.dll,动态库的引入库和静态库的扩展名都是.lib。

动态库优点:

  • 可执行程序体积小;
  • 程序的更新、部署、发布更简单:若动态库发生了改变,用户只需要更新动态库即可,不重新编译程序(函数接口不变);
  • 可以控制何时加载动态库:可以真正做到链接载入完全由程序员在程序代码中控制(显示调用);
  • 可共享:不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题,可实现进程之间的资源共享,这也是动态库也称为共享库的原因;
  • 代码保密:c++程序即使被反编译也只能还原20%左右。

动态库缺点:

  • 发布程序的时候,需要将动态库提供给用户;
  • 动态库没有被打包到应用程序中,加载速度相对较慢。

静态库与动态库的在linux下的制作、发布与使用方法可看:(9条消息) 动态库和静态库(.so/dll,.a/lib)_卖寂寞的小男孩的博客-CSDN博客_静态库后缀

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值