C语言的make和Makefile

C语言的make和Makefile

make和Makefile的介绍

make和Makefile

1:make和Makefile的介绍:

1:概念
在软件的工程中的源文件是不计其数的,其按照类型,功能,模块分别放在若干个目录中,哪些文件需要编译,那些文件需要后编译,那些文件需要重新编译,甚至进行 更复杂的功能操作,这就引入了我们的系统编译的工具:

在linux和unix中,有一个强大的使用程序,叫make,可以用它来管理多模块程序的编译和链接,直至生成可执行文件

make使用程序读取一个说明文件,称为Makefile,Makefile文件中描述了整个软件工程的 编译规则和各个文件之间的依赖关系;

Makefile就像是一个Shell脚本一样,其中可以执行操作系统的命令,它带来的好处就是我们能够实现“自动化编译”,一旦写好,只要一个make命令,整个软件功能就完全自动编译,极大的提高了软件开发的效率;

make是一个命令工具,是一个解释Makefile中指令的命令工具,一般来说大多数IDE都有这个命令

使用make可以是重新编译的次数达到最小化;

2:make和Makefile

1:make的使用语法:
make使用语法:
    make [选项][目标][宏定义]
    选项列表:
        -d  显示调试信息(debug)
        -f<文件> 指定从那个文件中读取以来关系,默认文件是"Makefile"或者"makefile","-"表示从标准输入(file)
        -h  显示所有选项的简要说明(help)
        -n 不运行任何Makefile命令,只去现实它们(no)
        -s 安静的方式运行,不显示任何信息(silence)
    可以使用-h来获取更多的选项:
2:Makefile的编写原则和规则
当make命令不带选项运行的时候,它从Makefile中读取指定规则

当制定规则不同与Makefile(makefile)的其他文件中时候,就要运行带有-f选项的make命令。如make.fray.Makefile
make -f make.fray.Makefile

Makefile的编写规则一:

目标列表:关联性列表
<TAB>命令列表

目标列表:是用一个或者多个空格分开的目标文件的清单

关联性列表:同样是一个或者多个空格分开的目标文件,是目标列表所以来的多个目标文件的清单;

命令列表:用于创建目标文件的将要执行的命令清单,这个命令列表被换行符号分开,命令列表中的每个命令必须要以<TAB>字符开始;

如:##Sample
    power:power.c
        gcc -o power power.c

如:#Sample
    power:power.o demo.o
        gcc -o power power.o demo.o
    power.o:power.c
        gcc -o power.o -c power.c
    demo.o:demo.c
        gcc -o demo.o -c demo.c

注意:书写的形式类似于倒推的形式

Makefile的编写规则二:(不建议使用)

目标列表:关联性列表;命令列表
命令列表是一系列被分号隔开的命令,一个很长的命令行要续行的时候需要用一个反斜杠符号
如:all/mymath_test:src/mymath.c src/mymath_test.c; \
gcc -o all/mymath_test src/mymath.c  \  
src/mymath_test.c

注意:makefile书写主要注意的是:
1:编译规则
2:依赖关系
3:倒推原理
4:使用make命令去执行
5:如果已经是最新的文件的时候,就不会再去编译执行了
6:make去读取makefile的时候,是按照依赖文件的顺序去查找并且执行命令的
7:make在编译的时候,如果发现被编译的文件已经是最新的了,就不会再去编译(减少了编译次数)
8:make文件是根据被编译文件的时间戳去判断文件是否是当前最新的文件,如果是最新的,那么就会去重新编译,如果不是最新的,就不会去进行编译;
9:千万要注意makefile中编译命令前面的分隔符

Makefile变量的使用

简单变量:
    定义
        变量名字:=[文本]
        这类变量的实质就是一组字符串
    添加
        变量名字+=[文本]或者 变量名字:=[文本][文本]
    引用变量
        $(变量名)
        $单字符变量(指的是但字符的变量 a:=123  $a)

        如:G:=gcc  一般我们都是定义成大写的
            $G -o power power.c

内置变量:
    $@   当前目标的名词
    $?   比当前目标更新的已修改的依赖性列表
    $<   依赖性列表的第一个文件
    $^   用空格分开的所有依赖性列表

虚目标

虚目标是不存在的文件
虚目标允许你去强制执行某些事件,但这些事件在正常的规则中是不会发生的 
虚目标不是真正的文件,make命令可以使用针对他们的任意规则
    虚目标总是使与之有关的命令被执行

all 生成工程中所有可以执行者,通常是makefile的第一个生成目标
test 运行程序的自动测试套件
clean 删除make all生成的所有文件
install 在系统目录中安装工程项目生成的可执行文件和文档
uninstall 删除make install安装的所有文件

特殊目标

make中有一些与定义的目标,这些预定义目标被make以一种特殊的方式进行处理,这些目标称为特殊目标;
.DEFAULTS  如果make找不到生成目标的任何makefile入口或后缀规则,就执行与目标相关的命令
.IGNORE  如果某一行makefile包含该目标,make忽略错误代码并继续建立,如果一个命令不正常存在,make自然会停止,带有-i选项的make命令可以执行相同的任务
.PHONY
    允许你指定一个不是文件的目标,所以您能只是make调用一系列makefile中的命令,即使在当前目录中有一个具有相同名字的文件
.SILENT
    make执行这些命令,但是不显示这些命令,带有-s的make可以执行相同的人物,
.SUFFIXES
    为目标指定的前提(后缀)可以与后缀规则相互关联,如果与目标没有相关性的前提,以存在的后缀列表就会被删除

默认模式规则

make中有许多预定义的规则成为后缀规则,它可以让make自动执行许多任务
为了建立一个目标,make会遍历一连串的依赖关系,这是为了决定从何处开始建立,如果没有找到目标文件,make就按有限顺序查找源文件       

默认模式规则:
    %o:%c
        $(CC) $(CFLAGS) -c $<
    $o:%s
        $(CC) $(AFLAGS) -o $@ $<

Makefile中的相关通配符:

#:注释
\:连接符号
关联列表和命令列表中可以使用shell通配符号? * %等

附上一个简单的makefile

#Sample
CC:=gcc
CFLAGS:=-Iinclude
CFLAGS+=-c
TARGET:=all/mytest_test3
DEPEND:=obj/mymath.o 
DEPEND+=obj/mymath_test.o

$(TARGET):$(DEPEND)
    $(CC) -o $@ $^
#obj/mymath.o:src/mymath.c
#   $(CC) -o $@ $(CFLAGS) $^
#obj/mymath_test.o:src/mymath_test.c
#   $(CC) -o $@ $(CFLAGS) $^

#使用make中的默认的模式规则
obj/%.o:src/%.c
    $(CC) -o $@ $(CFLAGS) $^ 



#声明clean是一个虚目标
.PHONY:clean
clean:
    rm -rf obj/mymath.o obj/mymath_test.o

在网上搜了好久,搜到一篇关于makefile写的非常详细的文档,在这里分享出来,希望对喜欢C的同学可以有点帮助。

How to write makefile

最后谢谢大家的访问:欢迎大家持续访问,有错误的地方希望各位看客能够及时指出,谢谢

  • 13
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Makefile 是用于自动化构建和管理 C 语言项目的常用工具。它使用文本文件来定义编译、链接和其他构建任务的规则。下面是一个简单的示例,演示了如何编写一个基本的 Makefile。 假设我们有一个包含两个源文件 main.c 和 utils.c 的项目,我们希望将它们编译为可执行文件 main。首先,我们需要创建一个名为 Makefile 的文件,并在其中添加以下内容: ```makefile # 编译器选项 CC = gcc CFLAGS = -Wall -Wextra # 目标文件 OBJS = main.o utils.o # 生成可执行文件 main: $(OBJS) $(CC) $(CFLAGS) $(OBJS) -o main # 编译每个源文件 %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ # 清理生成的文件 clean: rm -f $(OBJS) main ``` 在上面的 Makefile 中,我们首先定义了编译器选项,CC 表示编译器,CFLAGS 表示编译选项。接下来,定义了目标文件 OBJS,该变量包含了所有的目标文件。 然后,定义了生成可执行文件 main 的规则。该规则指定了依赖关系,即 $(OBJS) 表示目标文件依赖于对应的源文件。在命令行中使用变量 $(CC) 和 $(CFLAGS) 来调用编译器进行链接操作。 接下来,定义了编译每个源文件的规则。使用通配符 % 表示匹配任意文件名,%.o 表示所有的目标文件依赖于对应的源文件。命令行中的 $< 代表依赖的源文件,$@ 代表目标文件。 最后,定义了一个用于清理生成文件的规则 clean。该规则使用 rm 命令删除所有目标文件和可执行文件。 要使用 Makefile,只需在命令行中运行 make 命令即可自动执行构建任务。例如,运行 make 命令将会编译源文件并生成可执行文件 main,运行 make clean 命令将会清理生成的文件。 这只是一个简单的示例,Makefile 还可以进行更多复杂的配置和任务设置,例如定义目录、库文件、头文件等。可以根据实际项目的需求对 Makefile 进行扩展和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值