Linux下MakeFile文件

本文详细介绍了Makefile的基础知识,包括makefile文件的规则、make的工作原理、隐含目标、推导规则等内容。此外还讲解了如何引用其他makefile文件、通配符的使用、文件搜索路径的设置以及Makefile中常用的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. makefile文件是Linux下用于编译的规则文件,我们可以用make命令来运行makefile文件。makefile文件的基本规则如下:

          目标文件列表:依赖文件列表 [;命令语句]
                [命令语句]
                [命令语句]

       1).命令语句可以用分号和依赖文件列表子同一行,如果命令语句单独一行时,语句前面必须是tab。

       2).如果需要换行时,可以使用斜杠"/"来连接两行。

       3).隐含推导规则:当有一个.o目标文件时,如果没有相应的.c文件,那么makefile文件会自动推导出.c文件。如:

          main.o:main.h//相当于:main.o:main.h main.c
                    gcc -c main.c  -o main.o

3.make的工作原理:运行make命令时,首先通过目标文件列表找到相应的依赖文件,如果依赖的文件不存在,那么会查看其他依赖规则,知道生产相应的依赖文件。如果最后依赖文件还是不存在,那么make会退出,并报错。但是如果命令有错或者编译不成功,那么make会退出,但是不会报错。

4.如果目标文件后没有依赖文件那么执行makefile文件时,那么这个规则不会被执行。

5.隐含目标:可以使用.PHONY目标来定义伪目标。伪目标没有依赖文件。

.PHONY:clean
clean:
         rm file

或者:

clean:
         rm file

6.推导规则:make可以通过.o文件推导出相应的.c依赖文件,如果没有命令,可以通过推导规则,推导出相应的命令。

7.makefile文件的5个重要东西:显示规则、隐含规则、定义变量、文件指示和凝视(相当于独行注释)。

8.文件命名:默认情况下,make会在当前目录下按顺序寻找”GNUmakefile“、”makefile“、”Makefile“。当然也可以命名其他名字:那么运行的时候方式如下:make -f filename和make --file filename。

9.引用其他makefile。

include filename [filename....]

       可以使用include来包含其他makefile。这个include可以包含变量等。如果没有指定绝对路径或相对路径,那么首先会在当前目录下查找文件,如果没有找到,那么会到如下文件查找:

     1)、假设make运行时,有“-I”或“--include-dir”參数,那么make就会在这个參数所指定的文件夹下去寻找。
     2)、假设文件夹<prefix>/include(通常是:/usr/local/bin或/usr/include)存在的话,make也会去找。

       如果没有找到,那么首先会福利这个错误,继续其他导入,然后会再次尝试,如果还是没有找到,那么会产生一个致命错误。我们也可以通过在include前面加"-"来忽略这种错误,如下:

-include filename

10.makefile中的通配符

       "*"、“?”、"[......]"和"~"。其中"~"表示当前用户的$home文件夹

11.文件搜索

          1)如果没有指定文件搜索路径,那么只会在当前路径搜索文件。

          2)可以通过设置VPATH变量来指示搜索路径,不同路径通过“:”隔离。如:

                    VPATH=stc:../header

          3)可以通过vapth来指定不同文件到不同路径搜索。形式如下
                    vpath <pattern> <directories>   #符合pattern类型的文件到directories路径下查找

                    vpath <pattern>                         #删除pattern类型文件的查找路径

                     vapth                                         #删除所有文件的查找路径

              可以使用"%"来匹配一个或多个字符

12.伪目标

         伪目标一般没有依赖文件,一般不能与文件重名,但我们可以使用.PHONY来定义伪目标,那么这样这个目标就可以和文件伪目标重名,并且可以有依赖文件。

.PHONY: cleanall cleanobj cleandiff

cleanall : cleanobj cleandiff
       rm program

cleanobj :
       rm *.o

cleandiff :
       rm *.diff

13.Makefile经常使用的一些函数

         在Makefile中也可以使用函数,函数使用方式为:$后面跟着左括号,然后是函数名,后面是用空格隔开的参数,最后是右括号。如下:    

      $(函数名 参数1,参数2)

      1)foreach函数,格式如下:

      $(foreach 参数1,参数2,参数3)

            意义:该函数将参数2的单词逐个取出放在参数1中,参数1然后用于参数3表达式,参数3表达是会返回一个字符串,如此循环结束。返回的字符串之间使用空格隔开。

      2)wildcard函数,格式如下:

      $(wildcard 参数)

            意义:该函数会匹配符合参数的列,最后返回一个列表

      3)patsubst函数,格式如下:

$(patsubst 参数1,参数2,参数3)

           意义:该函数会将参数3的单词逐个取出,然后看是否匹配参数1,如果匹配参数1,那么使用参数2替换。

14.一些系统变量

Makefile 中很多时候通过自动变量来简化书写, 各个自动变量的含义如下:

自动变量

含义

$@目标集合
$%当目标是函数库文件时, 表示其中的目标文件名
$<第一个依赖目标. 如果依赖目标是多个, 逐个表示依赖目标
$?比目标新的依赖目标的集合
$^所有依赖目标的集合, 会去除重复的依赖目标
$+所有依赖目标的集合, 不会去除重复的依赖目标
$*这个是GNU make特有的, 其它的make不一定支持

  













<think>我们首先回答用户的问题:LinuxMakefile文件的基本规则 然后,按照要求,在回答末尾输出"§§相关问题§§",并紧接着提出3-5个相关问题。 Makefile的基本规则包括目标、依赖和命令三部分。格式如下: target: prerequisites recipe 其中: - target:通常是要生成的文件名,也可以是一个动作名称(伪目标)。 - prerequisites:生成target所依赖的文件或目标。 - recipe:命令行,必须以Tab键开头,由一行或多条命令组成。 示例: ```makefile # 一个简单的Makefile示例 hello: hello.c gcc -o hello hello.c ``` 在这个示例中: - target是hello(可执行文件) - 依赖是hello.c - 命令是gcc -o hello hello.c 另外,Makefile中还可以定义变量,使用条件判断,使用通配符,以及使用内置函数等。 伪目标:通常用于执行一些操作,而不是生成文件。例如: ```makefile .PHONY: clean clean: rm -f hello ``` 这样,当执行`make clean`时,就会执行删除hello文件的命令,而不管当前目录下是否有名为clean的文件。 现在,根据要求,我们需要在回答后提出3-5个相关问题。 §§相关问题§§ 1. Makefile中的变量如何定义和使用? 2. 如何编写一个规则来编译多个C文件并链接成可执行文件? 3. Makefile中的自动变量(如$@, $<, $^)分别代表什么? 4. 怎样在Makefile中使用条件判断? 5. 如何避免Makefile中命令行的回显?</think>### LinuxMakefile文件基本规则 MakefileLinux 开发中自动化编译的核心文件,其基本规则结构如下: ```makefile 目标文件: 依赖文件 [TAB]命令列表 ``` - **目标文件**:要生成的文件(如可执行文件、`.o`文件)或伪目标(如 `clean`) - **依赖文件**:目标文件构建所需的源文件或前置目标 - **命令列表**:以 **Tab 开头**的 shell 命令(不能使用空格替代) #### 核心示例 ```makefile # 编译可执行程序 app: main.o utils.o gcc -o app main.o utils.o # 链接阶段 main.o: main.c gcc -c main.c # 编译阶段 utils.o: utils.c gcc -c utils.c # 伪目标(非文件) .PHONY: clean clean: rm -f *.o app ``` #### 关键特性 1. **变量**:`CC = gcc` 定义编译器,使用时 `$(CC)` 2. **自动变量**: - `$@` 当前目标名(如 `app`) - `$^` 所有依赖文件(如 `main.o utils.o`) - `$<` 第一个依赖文件 3. **通配符**:`*.c` 匹配所有 C 文件 4. **伪目标**:`.PHONY` 声明非文件目标(如 `clean`) #### 执行逻辑 1. 输入 `make` 默认构建第一个目标 2. 输入 `make clean` 执行清理操作 3. Make 根据文件时间戳判断依赖关系,仅重新构建过期的目标
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值