讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

剧云
剧云

中文短剧剧本制作平台

Linux:编译,链接,自动化构建工具

小辰吖_1648

小辰吖_1648

发布时间:2025-06-20 14:38:01

|

688人浏览过

|

来源于php中文网

原创

将c语言源代码编译成可执行程序的过程包括以下几个步骤,每一步都对源代码进行了不同的处理:

  1. 预处理(.c文件 -> .i文件)

    目的:将头文件和宏进行替换,取消注释。文件从 code.c 变为 code.i。

    Linux:编译,链接,自动化构建工具

    现在我使用指令对 .c 文件进行预处理,让我们来看一下预处理后的代码:

    gcc -E code.c -o code.i

    可以看到头文件确实被库 <stdio.h></stdio.h> 中的代码替换了;而其他代码保持不变。

    Linux:编译,链接,自动化构建工具

    注意:替换后的代码仍然是C语言代码,只是变得更加简洁(没有注释)。

  2. 编译(.i文件 -> .s文件)

    目的:将C语言代码处理为汇编代码。

    这次我们直接使用预处理过的文件进行下一步的汇编:

    gcc -S code.i -o code.s

    Linux:编译,链接,自动化构建工具

    我们发现这次处理后的代码已经变成我们看不懂的了,这就是已经从C代码转换为了汇编代码。

  3. 汇编(.s文件 -> .o文件)

    目的:进一步处理汇编代码,形成机器可识别的代码(可重定向目标文件)。

    这次我们使用上一次的 code.s 文件继续编译,会报错;所以我们这次使用 code.c 来进行处理:

    gcc -c code.c -o code.o

    Linux:编译,链接,自动化构建工具

    这次的代码和上次的有变化,但还是看不懂。我们记住是从汇编代码处理为了机器可识别的代码,变成了可重定向目标文件。

  4. 链接(.o文件 -> exe文件)

    目的:产生可执行文件。

    这次使用 .o 文件链接为 exe 文件:

    gcc code.o -o code

    Linux:编译,链接,自动化构建工具

    E、S、c选项先有语言还是先有编译器?答案是先有语言,但并不是先有当前编译器的语言。在最早的时期,人们都是使用二进制语言来编写程序的;然而,为了更加方便地编写代码,人们使用二进制编写了汇编代码,因此汇编语言产生了。然后,人们又使用汇编代码开发出了汇编代码编译器,这个过程就叫做语言自举。

    动态连接和静态连接库的位置,我们平时使用的头文件都是声明,实现都在库文件中,库一般都在 /usr/include 目录下。

    Linux:编译,链接,自动化构建工具

    连接方式分为动态链接和静态连接。

    查看文件使用的哪种库?

    Linux:编译,链接,自动化构建工具

    根据红色的部分判断是什么库?

    云服务器默认没有安装C/C++静态标准库,我们可以使用 yum 按照下面的指令安装:

    sudo yum install libstdc++-static

    Makefile自动构建工具

    Linuxdo Application
    Linuxdo Application

    为 Linux.do 注册撰写高通过率、去 AI 化的中文小作文。进行自适应调查以了解申请人的真实背景,...

    下载

    我们可以把 Makefile 理解为指令的集合;Makefile 文件里有我们写好的很多指令,然后我们对 Makefile 进行操作就可以更加便捷地调用其内部的指令。

    举个例子,比如有一份 proc.c 的C语言文件,在使用的过程中需要多次对文件编译,通常情况下每次编译都要使用 gcc proc.c -o proc 生成可执行文件 proc;这样操作是很麻烦的。Makefile 工具可以很好地解决这种频繁调用编译的问题。

    Makefile 的使用:

    Linux:编译,链接,自动化构建工具

    第一行:proc 是生成的文件,proc.c 是依赖文件;冒号代表的是依赖关系。第二行需要空一个 Tab 键的长度(不能使用空格),然后输入要执行的命令。

    Linux:编译,链接,自动化构建工具

    我们直接使用指令 make 就可以调用 gcc proc.c -o proc 指令了,这样使用起来是不是会很方便?

    那是不是也可以这样方便地清理文件呢?

    答案是可以的:

    Linux:编译,链接,自动化构建工具

    不同的是删除代码不需要依赖任何文件,所以没有依赖文件。我们需要使用 make clean 来调用清除可执行程序的指令。

    为什么 gcc proc.c -o proc 直接使用 make 就可以呢?

    这是因为代码的执行顺序是从上到下的,make 默认调用第一个依赖关系命令,这里实际上 make 的完整指令应该是 make proc。

    目标的调用顺序

    现在来写一下C语言编译的完整过程:

    Linux:编译,链接,自动化构建工具

    程序执行的顺序是从上往下执行的,当执行 gcc proc.o -o proc 时,这时候还没有 proc.o 文件,所以就会先把这一行的指令放入堆栈中,依次类推,直到最后 gcc -E proc.c -o proc.i 产生了 proc.i 文件,紧接着指令依次出栈;最后执行完毕。

    .PHONY伪目标

    在没有使用 .PHONY 的情况下,proc.c 文件在最新版本时,只能 make 一次。这样做的目的是提高效率。

    Linux:编译,链接,自动化构建工具

    在此编译会给出“proc is up to date”,proc 可执行程序是最新的,不需要再次编译。

    如何查看文件是否是最新的?

    Linux:编译,链接,自动化构建工具

    stat 文件名:查看文件的最近一次的更改时间相关的信息。正常情况下,proc.c 文件的时间应该是在 proc 之前的,因为先有 proc.c 再有 proc;这是我刚才更新了一下 proc.c 文件,这时候 proc.c 比 proc 还要新,所以这个时候是可以重新编译的。

    使用伪目标忽略时间:

    Linux:编译,链接,自动化构建工具

    如果我们对 make proc 设置伪目标,那样就可以无限次地编译了。

    Linux:编译,链接,自动化构建工具

    总结

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6947

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2868

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6947

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2868

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

4530

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

3793

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

3113

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

7730

2023.07.05

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn