【Linux基础开发工具(三)】gcc/g++编译流程、条件编译与动静态链接

发布时间:2026/10/19 7:15:38
【Linux基础开发工具(三)】gcc/g++编译流程、条件编译与动静态链接 目录一、前言二、编译器翻译过程1.预处理1.宏替换、去注释2.头文件展开3.条件编译2.编译3.汇编4.链接三、条件编译初步理解链接1.条件编译1-是什么2-使用场景2.初步理解链接​编辑1.库是什么2.动态库动态链接优缺点3.静态库静态链接优缺点3.关于动静态链接的补充1.后缀2.如何改变链接方式四、gcc其他选项 - 了解即可五、小结一、前言前面博主向大家介绍了Linux基础开发工具yum和apt还有我们开发中最重要的vim编辑器。yum和apt是核心功能是软件包安装而vim编辑器的核心功能是编写代码的有了前面的基础我们还需要学习编译器——gcc和g。gcc和g仅用来做编译工作。它不像我们平时开发用的visual studio。GCC 和 G 是命令行编译工具主要负责预处理、编译、汇编和链接不提供编辑和调试环境Visual Studio 是 IDE集成了代码编写、编译、调试等功能。二、编译器翻译过程gcc编译选项格式gcc [选项]要编译的⽂件[选项] [⽬标⽂件]1.预处理预处理阶段核心功能是把c语言转换为干净的c语言。命令gcc -E code.c -o code.i-E选项的意思就是告诉编译器做完预处理就停下。预处理阶段具体动作表示为宏替换、去注释、头文件展开、条件编译等等。1.宏替换、去注释把我们定义的宏和对代码的注释全部去掉。2.头文件展开操作内容把我们include的头文件里的内容拷贝一份到原文件。具体操作中可以看到原文件的大小会变大。3.条件编译下文详讲2.编译编译就是把已经预处理好的源文件转换为汇编语言命令gcc -S code.i -o code.s-S选项的意思就是做完汇编就停下。3.汇编汇编就是把汇编语言转换为二进制点o文件。命令gcc code.s -o code.o-o选项的意思就是做完编译就停下。4.链接链接就是把编译好的二进制.o文件和库统一链接到一起形成二进制可执行文件。命令gcc code.c -o code一般程序的构建过程就是先把源文件编译成对应的.o文件然后再统一链接形成可执行程序。这样做可以提高编译的效率。我们可以想象,在一个大型项目中可能有成百上千个.c文件。如果每次修改一行代码都要把整个项目重新编译一遍那将极其耗时。所以编译被拆成了几个步骤编译-c把每个.c文件单独翻译成.o目标文件。修改了哪个文件就只重新编译哪个。链接Link把所有的.o文件加上系统库比如libc像搭积木一样拼装在一起最终生成一个可执行文件。三、条件编译初步理解链接1.条件编译1-是什么现在大家见一下条件编译是什么#includestdio.h void v1() { printf(this is 免费版\n); } void v2() { printf(this is 升级版\n); } int main() { #ifdef V1 v1(); #else v1(); v2(); #endif return 0; }#ifdef V1这是一个预处理指令。意思是If Defined—— 如果宏V1被定义了。如果定义了V1编译器就只编译v1();这一行。#else如果没有定义V1。如果没定义V1编译器就会编译v1();和v2();这两行。#endif结束这个条件判断。条件编译是可以对我们的代码进行裁剪的在预处理期间。预处理符是给编译器看的。2-使用场景我们可以类比我们平时下载的软件有免费版和收费版。v1提供的功能就是免费版v2就是在v1的基础上有所提升的功能就是收费版。所以条件编译可以用来进行多商业化软件进行不同种类的管理。2.初步理解链接1.库是什么以printf为例用最通俗的话来说库Library就是别人已经写好的、经过测试的、可以直接拿来用的代码集合。打个比方不用库自己造轮子你想打印一句话到屏幕上你需要自己写代码去调用操作系统的底层显卡驱动控制像素点在屏幕上画出字母。用库用现成工具前人已经把这些复杂的底层操作封装好了变成了一个叫printf的工具。你只要把它“拿过来”用就行。这个装满了各种现成工具的“百宝箱”就是库。2.动态库动态链接优缺点动态库通常和程序进行动态链接。情景一比如你是小王你进了一所高中你想考大学而有一个叫张三的学长顺利的考入了清华大学。你想着上学期间总要有一个娱乐活动吧你就问这个学长学校附近哪里有网吧张三呢就告诉你一个地址。你在学校有一天的计划表上午上完课中午计划去网吧放松一下。你按照张三学长给你的地址顺利的找到了这家网吧。网吧老板告诉你一个电脑号你又在那儿坐了下来开心的打了两个小时的无畏契约。上述情景我们可以把小王想象成是一个程序张三是编译器小王所在的高中是内存小王列的一天的计划表就是一个个的进程网吧就相当于是一个库电脑号就是要找的库函数。张三给小王地址这个动作可以想象成是链接器向程序写入链接地址就是向程序中写入库函数的地址。小王在学校列一天的清单就相当于是程序在执行时要用到的一个个的进程中午的时候要去上网就是需要用到这个动态库地址运行到这一条进程的时候程序就会根据链接器给的地址找到库函数从而查找和运行库程序。此时这个网吧就相当于是一个动态库。张三给小王网吧地址这个动作就相当于是动态链接。显而易见的是动态库和动态链接最大的缺点就是一旦库文件丢失所有的程序直接崩溃。而动态库和动态链接最大的优点就是节省资源动态库就相当于我们现在的共享经济。3.静态库静态链接优缺点静态库通常和程序进行静态连接。情景二小王去网吧这个行为被学校给发现了学校就找帽子叔叔就把这个网吧给拿下了。小王这时候就没有办法去网吧了但是小王还是想上网如果不放松一下的话学习不进去所以他就找他爸让他爸给他弄了一台电脑中午玩。他爸就跑到那个网吧找网吧老板要了一台小王之前用的电脑。上述情景中的小王他爸就相当于是一个静态库小王他爸给小王一台电脑这个动作就相当于静态链接。映射到链接过程就是把程序要用到的函数实现给该程序拷贝一份。可以看出静态链接和静态库最大的优点就是程序不依赖其他的库。也就是小王上不上网这个行为和这个网吧老板已经无关了。而缺点就是小王桌子上放一台电脑会很占位置。映射到链接过程就是将这个可执行程序变大了运行内存的时候加载的内存占据更多的内存空间。3.关于动静态链接的补充1.后缀操作系统静态库后缀动态库后缀命名习惯示例Linux.a(Archive).so(Shared Object)libmylib.a/libmylib.soWindows.lib(Library).dll(Dynamic Link Library)mylib.lib/mylib.dll2.如何改变链接方式linux下链接默认是动态链接。如何强制进行静态链接在命令行末尾加一个-static选项四、gcc其他选项了解即可-E 只激活预处理,这个不⽣成⽂件,你需要把它重定向到⼀个输出⽂件⾥⾯-S 编译到汇编语⾔不进⾏汇编和链接-c 编译到⽬标代码-o ⽂件输出到 ⽂件-static 此选项对⽣成的⽂件采⽤静态链接-g ⽣成调试信息。GNU 调试器可利⽤该信息。-shared 此选项将尽量使⽤动态库所以⽣成⽂件⽐较⼩但是需要系统由动态库.-O0 、-O1、-O2 、-O3 编译器的优化选项的4个级别-O0表⽰没有优化,-O1为缺省值-O3优化级别最⾼-w 不⽣成任何警告信息。-Wall ⽣成所有警告信息。五、小结这篇博客说白了就是把Linux下gcc/g这套编译流程捋了一遍从预处理、编译、汇编到链接每一步gcc在干什么、对应什么命令都过了一下。预处理阶段会做宏替换、去注释、头文件展开和条件编译后面再一步步生成汇编、目标文件最后链接成可执行程序。中间还拿“免费版/升级版”举例讲了条件编译顺便把动态库、静态库以及动态链接、静态链接的优缺点也初步聊了聊动态链接省资源但怕库丢失静态链接不依赖库但程序会变大。最后也补充了Linux和Windows下动静态库的后缀区别以及怎么调整链接方式。不过问题也来了现在编译一个文件还好手敲gcc命令还能忍要是项目里文件一多每次改完都手动敲一堆编译命令那就有点折磨人了。所以下一篇就顺理成章进入自动化构建——也就是make/makefile。简单说Makefile就是把这些编译规则、依赖关系提前写清楚make再根据文件有没有改动自动决定哪些要重新编译省得我们一遍遍手敲命令。这样从“会编译”到“会管理编译”开发效率就能往上提一截了。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询