一、程序的翻译过程:ESc->iso
1.1预处理:c->c
- 主要功能:宏替换、头文件的展开、条件编译、去注释;目的是让代码变得纯粹。
- 条件编译,可以实现对代码的裁剪。比如对于不同用户,设置不同的宏常量,条件编译时就会进入不同的分支,裁剪掉未使用的分支。
- 利用gcc的-E选项,可以让一个.c文件只完成预处理任务。gcc -E hello.c -o hello.i。
- -o表示目标文件,.i文件是经过预处理的.c文件。
1.2编译: c->汇编
- 主要功能:检查代码的规范性,是否有语法错误。没有的话将代码翻译为汇编语言。
- 使用gcc的-S选项,可以让一个.i文件只完成编译任务。gcc -S hello.i -o hello.s
1.3汇编: 汇编->二进制
- 主要功能:将.s文件转换为.o文件
1.4链接:
- gcc hello.c -o hello
二、编译器和编程语言
编译器本质上是一个软件,是由编程语言实现的。所以早期是先有编程语言才有的编译器。早期人和计算机实现交互依靠的是二进制编码。但是二进制效率太低,就发明了汇编语言。计算机依靠由二进制编码实现的编译器,将汇编语言翻译为二进制编码。之后又使用汇编语言实现汇编编译器,将c语言翻译为汇编语言。
三、gcc选项
四、动静态库概念和理解:
4.1对开发环境安装的理解:
安装下载并拷贝头文件和库文件到开发环境中的特定路径下。这个路径一定要可以被编译器自己找到。
4.2程序组成:
我们的代码+头文件(提供声明)+库文件(提供实现)=我们的可执行程序。
4.3库的命名规则:
- 库的真正名称,要去掉库的前缀名和后缀。以libc.so.6为例,去掉前缀lib和后缀so.6。这个库的真正名称就是c,即c标准库。
- 在Linux下,以.so结尾为动态库;以.a结尾为静态库。
- 在Windows下,以.dll结尾为动态库;以lib结尾为静态库。
- 静态库数量少于动态库。
4.4共享库:
动态库:
- 动态链接,是由c/c++或者其他第三方提供的所有方法的集合,被所有的程序以链接的方式联系起来。库中所有的函数都有入口地址,所谓动态链接,就是将要调用的函数在库中的地址拷贝到可执行程序的特定位置。
静态库:
- 静态链接,是由c/c++或者其他第三方提供的所有方法的集合,就是将要调用的函数在库中的代码拷贝一份到自己的代码中。
4.5动态链接和静态链接的优缺点:
- 动态链接,形成的可执行程序体积比较小,比较节省资源。但是要去动态库寻址调用,速度稍微慢一点。
- 静态链接,可以无视库独立运行,因为库中的函数被拷贝了一份放在自己的代码中;但是代码体积太大,浪费资源。
- gcc默认使用动态链接生成可执行程序,
4.6安装静态库:
- 默认情况下,不安装静态库。
- sudo yum install -y glibc.static 安装c语言静态库
- sudo yum install -y glibc-static libstdc++-static 安装c++静态库
4.7使用-static指定生成的可执行程序调用静态库。
五、自动化构建代码:
5.1所需命令:
- make/makefile:make是命令,makefile是当前目录下存在的一个具有特定格式的文件。
- 创建的文件的文件名可以为makefile,也可以是Makefile。
5.2解析:
- 依赖关系:mybin:code.c
- 以来方法:gcc code.c -o mybin
- 使用make自动编译当前目录生成可执行文件
- 直接make会自动使用第一个配置命令
- make+指定配置指令会调用指定的指令