热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Linux自动编译工具make/Makefile

VS中有一键编译自动运行,Linux也给我们提供了对应的编译方式,虽然不及VS那么便捷,但是相比于手动输入gcc-oaddadd.c&#x

VS中有一键编译+自动运行,Linux也给我们提供了对应的编译方式,虽然不及VS那么便捷,但是相比于手动输入 gcc -o add add.c ,我们一句make就可以搞定


Makefile是一个文件,能够存放上述 gcc -o add add.c 这种编译指令

make是一个命令工具,能够解释Makefile中的指令


要如何编译.c文件,关键就在于Makefile是怎么写的,下面我们主要介绍这两者的使用



目录

一、 单个文件的编译

1、写法一:逐个生成.i、.s、.o文件,最后再生成 test执行文件

2、 写法二:一步到位,直接通过 test.c 生成 test 执行文件(推荐)

3、 Makefile自动清理

二、多个文件的编译(同一目录下)

三、多个文件的编译(不同目录下)




一、 单个文件的编译

假设我们要编译这么一个test.c文件,我们希望编译生成一个名为test的可执行文件

我们在test.c所在目录下创建一个Makefile文件,这里有两种编译写法


1、写法一:逐个生成.i、.s、.o文件,最后再生成 test执行文件

先一步步向下分析,需要什么依赖文件,然后再一步步生成

编写好以后,我们只需要在命令行输入make,系统就会帮我们自动编译了,同时会生成每一步产生的文件按

 


2、 写法二:一步到位,直接通过 test.c 生成 test 执行文件(推荐)

Makefile中要写的内容如下

第一行:确定好依赖文件和目标文件。也就是要用依赖文件来生成目标文件

第二行:编译指令。

                $@ 指向第一行的目标文件,表示目标文件test

                $^ 指向第一行的依赖文件,表示依赖文件test.c

                -std 表示采用的C++标准

接下来我们只需要在命令行输入make,系统就会帮我们编译了,编译成功以后,当前目录下就会多出一个test 执行文件

 


3、 Makefile自动清理

我们每次开始编译之前,我们最好先清理一下之前生成的执行文件,手动输入 rm test 有点太麻烦了,Makefile只要写入下面的内容,就会自动帮我们清理了

如果我们还希望移除生成的.o 、.s、.i文件,那么第6行只要换成

rm -f test test.o test.s test.i

 一般我们make的时候,系统会自动调用,当然也可以手动调用,如

 我们会发现之前的test执行文件不见了


二、多个文件的编译(同一目录下)

现在我们有三个文件,分别是test.c、sub.c、sub.h,而且我们要在test.c中调用sub.h中的函数

 Makefile中的内容如下:

test执行文件 要依赖 多个文件生成的 .o文件,现在没有 .o文件,所以需要重新生成 .o文件

当前路径下有多个.c文件,我们逐个去写的话,就是

test.o:test.cgcc -c $@ $^
sub.o:sub.cgcc -c $@ $^

但是这样写太复杂了,我们可以选择下面这种写法

%.o: %.cgcc -c $<

%.o&#xff1a;表示目标文件是 .o文件

%.c&#xff1a;表示依赖文件是当前路径下的 .c文件&#xff0c;可以看作是一个集合中放着 test.c  sub.c

$<:   展开%.c &#xff0c;逐个生成对应的 .o文件&#xff0c;比如test.c就会生成对应的test.o、sub.c就会生成对应的

        sub.o

现在我们来运行一下

 


三、多个文件的编译&#xff08;不同目录下&#xff09;

现在我们有三个文件&#xff0c;test.c、sub.h、sub.c&#xff0c;但是其中sub.h、sub.c在其目录func_dir 下

 

 Makefile的内容如下&#xff1a;

 现在我们来运行一下试试


推荐阅读
  • 本文深入探讨了在安装PostgreSQL数据库系统时,执行Configure、Make及Make Install命令的具体含义与作用。 ... [详细]
  • iTOP4412开发板QtE5.7源码编译指南
    本文详细介绍了如何在iTOP4412开发板上编译QtE5.7源码,包括所需文件的位置、编译器设置、触摸库编译以及QtE5.7的完整编译流程。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 俗话说得好,“工欲善其事,必先利其器”。这句话不仅强调了工具的重要性,也提醒我们在任何项目开始前,准备合适的工具至关重要。本文将介绍几款C语言编程中常用的工具,帮助初学者更好地选择适合自己学习和工作的编程环境。 ... [详细]
  • 深入理解动态链接库及其应用
    本文将探讨动态链接库的基本概念,包括Windows下的动态链接库(DLL)和Linux下的共享库(Shared Library),并详细介绍如何在Linux环境中创建和使用这些库。 ... [详细]
  • 如何在Linux中实现字符设备控制
    本文详细探讨了在Linux环境下控制字符设备的方法,包括蜂鸣器和模数转换器(ADC)的实际操作案例。对于开发者来说,了解这些基础知识对于嵌入式系统的开发尤为重要。 ... [详细]
  • 本文介绍了在Makefile及Android.mk文件中添加打印输出信息的方法,并详细解析了Android编译过程中的关键步骤,包括环境变量的设置与编译脚本的执行。 ... [详细]
  • 本文将探讨如何在一个目录下针对多个源文件编写高效的Makefile,通过实例介绍从基础到高级的Makefile编写技巧。 ... [详细]
  • OpenWrt 是一款高度可定制的嵌入式 Linux 发行版,广泛应用于无线路由器等领域,拥有超过百个预装软件包。本文详细探讨如何在 OpenWrt 上通过 Luci 构建自定义模块,以扩展其功能。 ... [详细]
  • 本文介绍如何利用C语言在Linux操作系统中实现递归创建多级目录的功能,包括必要的头文件引入和函数实现。 ... [详细]
  • 本文详细记录了在Ubuntu 9.10操作系统上从零开始搭建LAMP(Linux, Apache, MySQL, PHP)环境的过程,包括遇到的问题及解决方案。旨在为初次尝试搭建LAMP环境的开发者提供参考。 ... [详细]
  • QEMU环境下加载首个Linux驱动模块
    本文介绍了如何在Ubuntu 20.04系统上使用QEMU虚拟机加载一个简单的Linux驱动模块。此过程涉及Linux内核4.0版本的配置与编译。 ... [详细]
  • 我们正在使用GNU Make来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。 ... [详细]
  • 在Linux系统中,许多应用程序以源代码的形式提供,这给安装带来了挑战。本文旨在介绍一种简化源码软件安装流程的方法,帮助用户更加轻松地完成安装。 ... [详细]
author-avatar
Peter-周周周成德
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有