linux下C++的编译过程

作者: daodaoliang
版本: V 0.0.1
日期: 2017年02月01日

在linux下面c++程序从源码变成用户触手可用的可执行程序通常分为配置、编译和安装,具体的过程和描述如下.

0x01 配置阶段(Configure)

一个生产环境的系统一般都是需要调用一些系统提供的功能库和一些其他功能库,由于系统环境的不同编译器需要知道系统库存在哪里,软件编译完成后安装在哪里,需要安装那些第三方组件等等,同时工程项目的文件也存在相互的引用和依赖关系,所有这些都需要在configure阶段解决。配置阶段完成以后会产生makefile文件。

0x02 编译阶段(Make)

编译阶段的就是把程序工程文件从人类可读经过处理后变成机器可执行的二进制指令码的过程,对于linux 下面 gcc 编译器来说一般是预处理、编译、汇编和链接。

0x021 预处理(Preprocessing)

预处理后的文件一般为.i结尾,这个过程一般包含以下几个子过程:

  • 展开宏定义,删除所有#define
  • 处理所有的条件预编译指令,#if #ifdef #elif #else #endif 等;
  • 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置;
  • 删除所有的注释;
  • 添加行号和文件标识,以便在编译时产生调试用的行号,以及编译错误的警告行号;
  • 保留所有的#pragma 编译器指令,在编译阶段编译器需要使用;

    通常如果只进行预处理的话一般用如下命令:

1
gcc -E hello.c -o hello.i

0x022 编译(Compilation)

编译的过程就是把工程文件进行一系列的词法分析、语法分析、语义分析、以及优化后生成相关的汇编代码;

通常如果只进行编译处理的一般用如下命令:

1
gcc -S hello.i -o hello.s

0x023 汇编(Assembly)

汇编器是将汇编代码转换成机器码

1
gcc -c hello.c -o hello.o

或者

1
as hello.s -o hello.o

0x024 连接(Linking)

链接的主要作用就是把各个二进制中间文件链接起来生成一个可执行的二进制文件,链接分为动态链接和静态连接:

  • 动态链接:链接阶段仅仅加入一些描述信息,而程序执行时再从系统中把相应的动态库加载到内存中。

linux-C++编译过程

0x03 安装阶段(make install)

编译的整个过程都是在内存中进行,编译出来的二进制可执行文件也是存在编译时指定的位置,下一步就是将可执行文件安装到用户指定目录并做好善后工作,这其中包含,创建对应的目录,保存文件,设置权限等步骤;同时程序安装完成后也需要还需要进行操作系统的关联,创建快捷方式和做文件关联等等个性化需求。

daodaoliang wechat
点击上面图片后用微信扫描,你就能认识一个有趣的灵魂了呀。
Fork me on GitHub