Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >make命令和makefile文件

make命令和makefile文件

作者头像
全栈程序员站长
发布于 2022-07-18 07:04:32
发布于 2022-07-18 07:04:32
2.6K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是全栈君

  make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具,它不仅常被用于控制源代码的编译,而且还用于手册页的编写以及将应用程序安装到目标目录。

  makefile文件由一组依赖关系和规则构成,每个依赖关系由一个目标和一组该目标所依赖的源文件组成,而规则描述了如何通过这些依赖文件创建目标,一般来说,目标是一个单独的可执行文件。

1. make命令的选项和参数

  make程序本身有许多选项,其中最常用的三个选项如下所示:

(1)-k:让make命令在发现错误时仍然继续执行

(2)-n:让make命令输出将要执行的操作步骤,而不真正执行这些操作

(3)-f <filename>:告诉male命令将哪个文件作为makefile文件

1.1 依赖关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myapp: main.o 2.o 3.o 
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h

  依赖关系定义了最终应用程序里的每个文件和源文件之间的关系

  如果想一次创建多个文件,可以利用伪目标all

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
all:    myapp    myapp.1

  建议约定:在自己的makefile文件中将第一个目标定为all,然后再列出其它重属目标

1.2 规则

  makefile文件中一个非常奇怪而又令人遗憾的语法现象:空格和制表符是有区别的,规则所在的行必须以制表符开头,用空格是不行的,如果makefile文件中的某行以空格结尾,也可能导致make命令执行失败。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myapp: main.o 2.o 3.o
    gcc -o myapp main.o 2.o 3.o
main.o: main.c a.h
    gcc -c main.c 
2.o: 2.c a.h b.h
    gcc -c 2.c
3.o: 3.c b.h c.h 
    gcc -c 3.c

1.3 makefile文件中的宏

  为了让makefile文件在面对大项目时不至于过于庞大和缺乏弹性,makefile文件允许使用宏以一种更通用的格式来书写它们

  MACRONAME = value

(MACRONAME){MACRONAME}或

  若要定义一个值为空的宏,可以MACRONAME =

  宏通常都是在makefile中定义的,但也可以在调用make命令时在命令行上给出宏定义,例如male CC=c89.命令行上的宏定义将覆盖makefile中的宏定义。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
all: myapp 

#which compier
CC = gcc

#where are include files kept
INCLUDE = 

#options for development
CFLAGS =  -g -Wall -ansi

#options for release
#CFLAGS = -0 -Wall -ansi

myapp: main.o 2.o 3.o
    $(CC) -o myapp main.o 2.o 3.o
main.o: main.c a.h
    $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
2.o: 2.c a.h b.h 
     $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
     $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

  ”-g” 是 gcc 的选项, “-o”也是 gcc 的选项。前者指示加入调试信息,后者指示对代码进行优化。

   gcc 的-Wall 选项可以打印出编译时所有的错误或者警告信息

1.3.1 make命令内置的特殊宏

  $?   当前目标所依赖的文件列表中比当前目标文件还要新的文件

  $@  当前的目标的名字

  $<   当前规则的第一个依赖文件

  $^   当前规则的所有依赖文件,以逗号分隔

  $*   不包括后缀名的当前依赖文件的名字

  -   告诉make命令忽略所有的错误

  @   告诉make在执行命令前不要将该命令显示在标准输出上@echo

  $(@D) 目标文件的目录名部分

  $(@F) 目标文件的文件名部分

1.3.2 多个目标

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
all: myapp 

#which compier
CC = gcc

#where to install
INSTDIR = /usr/local/bin

#where are include files kept
INCLUDE = 

#options for development
CFLAGS =  -g -Wall -ansi

#options for release
#CFLAGS = -0 -Wall -ansi

myapp: main.o 2.o 3.o
    $(CC) -o myapp main.o 2.o 3.o
main.o: main.c a.h
    $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
2.o: 2.c a.h b.h 
     $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
     $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

clean:
    -rm main.o 2.o 3.o 

install:myapp
    @if [-d $(INSTDIR)]; \
        then \
        cp myapp $(INSTDIR) &&\
        chmod a+x $(INSTDIR)/myapp && \
        chmod og-w $(INSTDIR)/myapp;\
    else \
        echo "Sorry,$(INSTDIR) does not exist";\
    fi

  clean:删除不需要的目标文件,由于clean:的后面是空的,因此该目标总被认为是过时,所以在执行make命令时,如果指定目标clean,则目标所对应的规则将总被执行

  install:将编译成功的应用程序安装到另一个目录下

  -rm:rm命令以减号开头是让make命令忽略rm命令的执行结果

1.4 内置规则

  可以通过make -p来打印make的所有内置规则,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
OUTPUT_OPTION=-o ¥@
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
%.o: %.c
    $(CONPILE.c) $(OUTPUT_OPTION) $<

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/120121.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年12月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
makefile从入门到放弃——博主吐血整理的笔记
在没有编写makefile之前可以使用命令gcc *.c -Wall查看当前代码是否有语法错误。检查没有语法错误以后可以编写makefile文件。
全栈程序员站长
2022/09/05
1.7K0
makefile 基础、进阶及常用 makefile
1、若想生成目标,检查规则中的依赖条件是否存在,如不存在,则寻找是否有规则用来生成该依赖文件 2、检查规则中的目标是否需要更新,必须先检查它的所有依赖,依赖中有任一个被更新,则目标必须更新
我与梦想有个约会
2023/10/21
4360
[Linux工具] Makefile
Linux的make程序用来自动化编译大型源码,很多时候,我们在Linux下编译安装软件,只需要敲一个make就可以全自动完成,非常方便。
DevKevin
2025/01/03
1280
【嵌入式】嵌入式项目手动与自动化构建流程详解
在嵌入式开发过程中,从源代码编写到最终程序烧录涉及多个关键步骤,这些步骤在手动方式和自动化方式下有所不同。本文详细介绍了8个嵌入式项目处理流程:源代码编写、预处理、编译、汇编、链接、生成二进制和 HEX 文件、烧录以及清理。每个流程都有其独立的操作命令,并对不同的开发工具链进行详细讲解。
LuckiBit
2025/03/06
1250
Makefile 的使用
在 Linux 中使用 make 命令来编译程序,特别是大程序;而 make 命令所执行的动作依赖于 Makefile 文件。最简单的 Makefile 文件如下:
韦东山
2020/10/30
4.3K1
Makefile 的使用
实战Makefile前,该知道那些知识?
在前一篇文章讲解了Makefile的一些概念和原理,接下来说说Makefile的一些知识点。
Rice加饭
2022/05/10
4890
全网最牛Linux内核Makefile系统文件详解(纯文字代码)
第一部分、概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows 的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,ma
嵌入式Linux内核
2022/09/22
3.3K0
全网最牛Linux内核Makefile系统文件详解(纯文字代码)
【Linux】快速上手Makeflie & CMake
如果有还不太了解gcc/g++编译器编译命令的可以先移步:【Linux】手把手教你从零上手gcc/g++编译器
修修修也
2025/03/21
1050
【Linux】快速上手Makeflie & CMake
Linux — Makefile的学习笔记以及多级目录下Makefile的编写
1、由于Makefile中对于制表符(tab)、还有unix和windows中对于换行符的不同等等原因,本文中所有的Makefile文件中的内容不建议您直接复制然后粘贴使用,如果可以手动敲入是为最佳。如果出现在make的时候出现异常,请详细检查并关注文件格式以及内容编写的格式等等。
全栈程序员站长
2022/09/06
5.7K0
Linux — Makefile的学习笔记以及多级目录下Makefile的编写
Linux笔记(9)| 一步步深入Makefile
今天分享的是如何一步步深入地学习Makefile。在Linux中编译代码,不像是Windows中有很多集成的IDE,Linux中都是通过基本的编译工具如gcc来进行,比如要编译main.c这个文件,可以使用gcc main.c -o main.但是如果源文件很多,这种方法就不适用了,所以,必须要学会使用Makefile。
飞哥
2020/07/10
9200
Linux笔记(9)| 一步步深入Makefile
如何编写一个Makefile文件(手把手的教你)
这个树形图展示了一个项目中的层级关系,如果我们需要变动3号文件,会发现,牵一发而动全身,改动一个被迫需要改动一堆,为了解放我们,make中编写Makefile就不再需要考虑这些,你把每个文件的依赖关系以指令的形式说明清楚并且保存下来,改动一个即可,会自动帮你修改关联到的其他文件。
全栈程序员站长
2022/09/02
3.9K1
Makefile常用模板「建议收藏」
做开发的特别是C/C++开发者一般都会用到Makefile,然而多数时候在公司做项目都不需要自己去写Makefile,仅仅停留在能看懂的基础上。因为make命令编译实在是太方便了,所以自己写写小项目用一用还是挺好的。网上关于Makefile教程也很多,总结一下近几年用到的常用脚本,方便自己查阅,如果能帮到别人那便是极好的_。
全栈程序员站长
2022/09/02
1.4K0
深入掌握 Makefile 与 Make 工具:高效管理自动化编译的核心原理和最佳实践
make 是一个在 Unix/Linux 系统中广泛使用的构建工具,用于自动化编译和构建项目。make 命令通过读取一个名为 Makefile 或 makefile 的文件,根据其中定义的规则执行各种任务(如编译、链接等),从而简化和自动化项目的构建过程。
Srlua
2024/10/30
6170
深入掌握 Makefile 与 Make 工具:高效管理自动化编译的核心原理和最佳实践
换个角度说Makefile
作为Linux下的C/C++开发者,没接触过makefile一定说不过去,通常构建大型的C/C++项目都离不开makefile,也许你使用的是cmake或者其他类似的工具,但它们的本质都是类似的。
编程珠玑
2020/02/11
7620
换个角度说Makefile
多文件目录Makefile的写法
  linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile
杨永贞
2020/08/04
4K0
多文件目录Makefile的写法
Linux makefile使用基础
makefile就像一个Bash脚本,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
xxpcb
2020/08/04
4.3K0
makefile终极奥义
或许很多Winodws 的程序员都不知道这个东西,因为那些 Windows 的 IDE 都为你做了这个工作,但是一个好的和 professional 的程序员, makefile 还是要懂。这就好像现在有这么多的 HTML 的编辑器,但如果你想成为一个专业人士,你还是要了解 HTML 的标识的含义。特别在 Unix 下的软件编译,你就不能不自己写 makefile 了,「会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力」。因为 makefile 关系到了整个工程的编译规则。
DeROy
2021/02/05
1.3K0
手把手教你写一个 Makefile 文件
如果我们是在Linux下开发,那Makefile肯定要知道,不懂Makefile,面对较大的工程项目的时候就会比较麻烦,懂得利用开发工具将会大大提高我们的开发效率,也可以说Makefile是必须掌握的一项技能。
混说Linux
2023/02/24
1.6K0
手把手教你写一个 Makefile 文件
linux: Makefile 脚本关键概念解析
Makefile 是在 Unix 系统下用来管理项目编译的工具,其语法和概念对自动化构建和管理项目非常重要。本文将详细讲解 Makefile 脚本中的关键概念,并结合实际案例帮助读者深入理解这些概念。
运维开发王义杰
2024/05/10
1600
linux: Makefile 脚本关键概念解析
超清晰的makefile解释、编写与示例
Makefile范例教学 Makefile和GNU make可能是linux世界里最重要的档案跟指令了。编译一个小程式,可以用简单的command来进行编译;稍微复杂一点的程式,可以用shell script来帮忙进行编译。如今的程式(如Apache, Linux Kernel)可能动辄数百万行程式码,数万个标头档(headers)、库库(libraries)以及程式码(source code),如果只是针对几个档案进行修改,却要用shell script整个程式重新编译,不但浪费时间也相当没有效率。GNU
老白
2018/03/19
5.2K0
推荐阅读
相关推荐
makefile从入门到放弃——博主吐血整理的笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验