热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux编译器make,linux中的‘make’和‘makefile’

在提及‘make’和‘makefile’之前有必要先理清楚程序编译的过程,在windows操作系统下,我们一般使用的编写程序的软件有vs、vc等

在提及‘make’和‘makefile’之前有必要先理清楚程序编译的过程,在windows操作系统下,我们一般使用的编写程序的软件有vs、vc等,这些都是集成软件,当编写完程序之后,直接点击进行编译和链接,那么编译器是怎样将程序进行编译的呢?

◆编译过程

(1)预处理阶段

将程序编辑完成之后,在编译之前,编译器会先对程序进行一下预处理,预处理阶段一般的工作是将程序的注释去掉,将头文件在源文件之中进行展开,同时进行宏替换等操作,经过处理之后就会生成一个.i文件。

(2)编译阶段

将编译的源程序转换为汇编代码,生成.s文件。

(3)汇编阶段

将汇编文件.s转换为计算机能够识别的二进制文件.o文件。

(4)链接阶段

将引用其他的.o文件和二进制文件链接到一块,形成二进制文件.exe。

windows上面的编译环境都是集成化的,程序员可以不用过于在于程序执行的过程,但是在liunx系统中编辑器、编译器、调试器都是分隔开的,我这里使用的编辑器是vim,编译器是gcc,调试器为gdb,这里需要澄清一下make和makefile(也可以为Makefile)的区别?

make和makefile是两个完全不一样的东西,make是一条指令,能够进行程序的编译,而makefile是一个文件,一般可以使用gcc指令进行编译生成许多的目标文件,makefile文件中都是一些编译的指令,当makefile文件写好之后,只需要使用make指令就能够完成编译过程,下面以一个简单的程序介绍一下linux中程序的执行过程:

■编写main.c文件

1d9b0129483a01650856f1c88a388ca6.png

■编写test.c文件

83d51d0b33feb1e9264f99119b724ef4.png

■编写test.h文件

1e63431c951649feb37b8bdcb5676021.png

显而易见,如果想要执行main.c文件就离不开这三个文件,那这三个文件之间存在什么样的关系呢?想要执行程序就需要有main.o、test.o文件,而test.o和main.o文件就需要有test.s和main.s文件,同时main.s和test.s文件又依赖于main.i和test.i文件,而这两个文件又依赖于main.c和test.c文件,编译过程中产生的文件之间都存在这依赖关系,即就是编译的逆过程,下面进行简单的图示:

8c2877bb74b8df8ea34769faa7a72c30.png

◆下面是简写的makefile文件:

7fb9286204401f7f7d9ae1dc8defb85b.png

根据上面的makefile文件,简单的介绍一下makefile文件的执行过程,makefile文件是顺序执行的,执行过程中会按照指令生成对应的目标文件,clean是一个动作的名字,当输入make进行编译时,不会执行clean的内容,如果输入命令make clean的指令,然后就直接跳到clean位置执行clean的内容,将刚才编译时产生的目标文件进行删除,下面是程序执行的过程:

86fe15d3f2708903cbf80d1b4441548d.png

aa489a236342c793fd7dbf10dbf05b0f.png

注意:

(1) 如果不想变异的过程中,将执行的编译指令输出,可以在makefile文件中的编译指令前进行添加@字符,即就是@gcc -c test.c   ,这样执行的指令就会被隐藏。

(2)makefile中使用的注释符号为‘#’。

(3)clean只是一个动作的名字,它是没有依赖关系的,所以clean的后面只有‘:’,没有其他的文件之类的东西。



推荐阅读
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 在Linux系统中,许多应用程序以源代码的形式提供,这给安装带来了挑战。本文旨在介绍一种简化源码软件安装流程的方法,帮助用户更加轻松地完成安装。 ... [详细]
  • 本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ... [详细]
  • 本文介绍了一种方法,通过使用Python的ctypes库来调用C++代码。具体实例为实现一个简单的加法器,并详细说明了从编写C++代码到编译及最终在Python中调用的全过程。 ... [详细]
  • 实现系统调用
    实现系统调用一、实验环境​本次操作还是基于上次编译Linux0.11内核的实验环境进行操作。环境如下:二、实验目标​通过对上述实验原理的认识,相信 ... [详细]
  • 本书详细介绍了在最新Linux 4.0内核环境下进行Java与Linux设备驱动开发的全面指南。内容涵盖设备驱动的基本概念、开发环境的搭建、操作系统对设备驱动的影响以及具体开发步骤和技巧。通过丰富的实例和深入的技术解析,帮助读者掌握设备驱动开发的核心技术和最佳实践。 ... [详细]
  • 在 Debian 11 系统中部署 CMake 的详细步骤与最佳实践
    CMake是一个免费、开源、跨平台的工具系列,旨在构建、测试和打包软件. CMake用于使用简单的平台和独立于编译器的配置文件来控制软件编译过程,并生成可在您选择的编译器环境中使用 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
  • 本文详细介绍了如何在Windows操作系统中配置和使用Lex(Flex)与Yacc(Bison),包括软件的下载、安装以及通过示例验证其正确性的步骤。 ... [详细]
author-avatar
唯爱WE创丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有