makefile基础

1:一个简单规则可以表述为

   规则(rule)目标文件:依赖文件(不同文件以空格分隔)

                      <tab>得到目标文件需要的命令

   规则的常见种类有:

       a:Explicit Rule:         最简单的rule,明确指出了目标和依赖,以及如何有依赖得到目标。
	Hello.o:hello.cpp
	    g++ -c hello.cp
       b:Pattern Rule:使用了wildcard(通配符)的规则
            makefile中的通配符是百分号%,相当于bash中的*,在描述规则的时候使用的都是%。makefile中也可以看到通配符*
       prog:*.c
   	    g++ -o prog $^
      c: Suffix Rule 顾名思义,是只使用后缀来描述的rule,描述的时候不使用pattern。

这个suffix rule的作用和下面这个pattern rule的作用是完全一样的。区别仅在于描述依赖的时候,一个把目标放在后,一个把目标放在前面。

       .c.o:       
	   $(COMPILE.C) $(OUTPUT_OPTION) $<
             上面代码等价于下面
       %.o:%.c
    	   $(COMPILE.C) $(OUTPUT_OPTION) $<
         d: Implicit Rule : 就是看不到的rule,这些rule是make的内置rule。

    makefile有众多的build-in rule,这些规则为我们编写makefile带来了很大的便利。它们可以通过make –p 来查看

2:Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,   所以一定要让make知道你的最终目标是什么。

   一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。

3:伪目标一定被执行。

       “.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。

4:自动变量 

    a: $@表示规则的当前目标文件名。            
     bigoutput littleoutput : text.g 
            	generate text.g -$(subst output,,$@) > $@ 

   上述规则等价于:          

     bigoutput : text.g 
           	generate text.g -big > bigoutput 
     littleoutput : text.g 
           	generate text.g -little > littleoutput 

 其中,-$(subst output,,$@)中的“$”表示执行一个Makefile的函数,函数名为subst,后面的为参数。

   “$@”这里是表示目标的集合,就像一个数组,“$@”依次取出目标,并执于命令。

    b:$ <表示所有的依赖目标集。    
     objects = foo.o bar.o 
     all: $(objects) 
     $(objects): %.o: %.c 
            $(CC) -c $(CFLAGS) $ < -o $@  

  其中,“$ <”表示所有的依赖目标集(也就是“foo.c bar.c”)

   

Makefile 是一种用于自动化构建项目的工具,广泛应用于 C/C++ 项目中。它通过定义一系列规则来控制编译、链接等过程,从而实现高效的项目管理。以下是 Makefile基础知识和使用方法的详细解析。 ### 1. Makefile 的基本结构 Makefile 的核心是定义 **目标(Target)**、**依赖(Dependencies)** 和 **命令(Commands)**。基本格式如下: ``` 目标: 依赖 <TAB>命令 ``` 目标通常是最终生成的可执行文件或中间目标文件(如 `.o` 文件)。依赖是生成目标所需要的文件。命令是用于生成目标的具体操作,必须以 `<TAB>` 开头。 例如: ```makefile main: main.o utils.o $(CC) -o main main.o utils.o ``` 在这个例子中,`main` 是目标,`main.o` 和 `utils.o` 是依赖文件,`$(CC)` 是编译器变量,通常定义为 `gcc` 或 `g++`。 ### 2. 变量的定义与使用 Makefile 支持变量定义,可以简化重复的代码。变量通过 `=` 或 `:=` 进行赋值,使用时通过 `$(变量名)` 调用。 例如: ```makefile CC = gcc CFLAGS = -Wall -Wextra -g DEPS = demo.h OBJ = demo.o demo: $(OBJ) $(CC) -o $@ $^ $(CFLAGS) ``` 在上述代码中,`CC`、`CFLAGS`、`DEPS` 和 `OBJ` 都是自定义变量,分别表示编译器、编译选项、依赖文件和目标文件 [^3]。 ### 3. 伪目标(.PHONY) 某些目标(如 `clean`)并不是实际的文件,而是用于执行特定操作。为了防止与同名文件冲突,需要使用 `.PHONY` 显式声明这些目标。 例如: ```makefile .PHONY: clean clean: rm -f *.o main ``` 此代码定义了一个伪目标 `clean`,用于删除所有 `.o` 文件和最终生成的 `main` 可执行文件 [^4]。 ### 4. 模式规则(Pattern Rules) 模式规则用于匹配多个文件,通常使用 `%.o: %.c` 这样的形式,表示所有 `.o` 文件都依赖于对应的 `.c` 文件。 例如: ```makefile %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) ``` 该规则表示:所有 `.o` 文件由对应的 `.c` 文件和依赖文件 `$(DEPS)` 编译生成 [^3]。 ### 5. 自定义函数(Custom Functions) Makefile 支持自定义函数,通常使用 `define` 和 `endef` 定义函数体,并通过 `call` 调用。 例如: ```makefile define compile-c $(CC) -c -o $1 $2 $(CFLAGS) endef main.o: main.c $(call compile-c,main.o,main.c) ``` 在这个例子中,`compile-c` 是一个自定义函数,接受两个参数(目标文件和源文件),并执行编译操作 [^2]。 ### 6. 自动变量(Automatic Variables) Makefile 提供了一些自动变量,用于简化规则的编写: - `$@`:表示目标文件。 - `$<`:表示第一个依赖文件。 - `$^`:表示所有依赖文件。 例如: ```makefile main: main.o utils.o $(CC) -o $@ $^ $(CFLAGS) ``` ### 7. 示例 Makefile 以下是一个完整的 Makefile 示例: ```makefile CC = gcc CFLAGS = -Wall -I. DEPS = demo.h OBJ = demo.o AIM = demo $(AIM): $(OBJ) $(CC) -o $@ $^ $(CFLAGS) %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) .PHONY: clean clean: rm -f $(OBJ) $(AIM) ``` 该 Makefile 定义了编译 `demo.c` 生成 `demo` 可执行文件的规则,并支持清理操作 [^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值