如何用一个makefile编译多个目标

使用 .PHONY, 使用方法见下面描述或参考链接. 经过测试可行.
---------
phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序:
  all : prog1 prog2 prog3
  .PHONY : all
  prog1 : prog1.o utils.o
          cc -o prog1 prog1.o utils.o
  prog2 : prog2.o
          cc -o prog2 prog2.o
  prog3 : prog3.o sort.o utils.o
          cc -o prog3 prog3.o sort.o utils.o
  这样,使用"make"将可以将三个程序都生成了。d
  当一个phony 目标是另一个的依赖,其作用相当于子程序,例如:
  .PHONY: cleanall cleanobj cleandiff
  cleanall : cleanobj cleandiff
          rm program
  cleanobj :
          rm *.o
  cleandiff :
          rm *.diff



PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用PHONY 目标:避免和同名文件冲突,改善性能。

如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标时都执行。例如:
  clean:
  rm *.o temp
因为"rm"命令并不产生"clean"文件,则每次执行"make clean"的时候,该命令都会执行。如果目录中出现了"clean"文件,则规则失效了:没有依赖文件,文件"clean"始终是最新的,命令永远不会 执行;为避免这个问题,可使用".PHONY"指明该目标。如:
  .PHONY : clean
  这样执行"make clean"会无视"clean"文件存在与否。

已知phony 目标并非是由其它文件生成的实际文件,make 会跳过隐含规则搜索。这就是声明phony 目标会改善性能的原因,即使你并不担心实际文件存在与否。
  完整的例子如下:
  .PHONY : clean
  clean :
  rm *.o temp

phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序:
  all : prog1 prog2 prog3
  .PHONY : all
  prog1 : prog1.o utils.o
           cc -o prog1 prog1.o utils.o
  prog2 : prog2.o
           cc -o prog2 prog2.o
  prog3 : prog3.o sort.o utils.o
           cc -o prog3 prog3.o sort.o utils.o

假设

你的一个项目最后需要产生两个可执行文件。你的主要目标 是产生两个可执行文件,但这两个文件是相互独立的——如果一 个文件需要重建,并不影响另一个。你可以使用“假象目的”来 达到这种效果。一个假象目的跟一个正常的目的几乎是一样的, 只是这个目的文件是不存在的。因此, make 总是会假设它需要 被生成,当把它的依赖文件更新后,就会执行它的规则里的命令行。 

如果在我们的 makefile 开始处输入: 

all : exec1 exec2 

其中 exec1 和 exec2 是我们做为目的的两个可执行文件。 make 把这个 'all' 做为它的主要目的,每次执行时都会尝试把 'all' 更新。但既然这行规则里没有哪个命令来作用在一个叫 'all' 的 实际文件(事实上 all 并不会在磁碟上实际产生),所以这个规 则并不真的改变 'all' 的状态。可既然这个文件并不存在,所以 make 会尝试更新 all 规则,因此就检查它的依靠 exec1, exec2 是否需要更新,如果需要,就把它们更新,从而达到我们的目的。


Makefile是一种用于编译和构建程序的自动化工具,它使用一种名为make的程序来控制编译过程。在Makefile中,您可以定义一系列的规则来说明如何编译和链接程序中的各个文件。当您需要编译多个C源文件时,可以在Makefile中创建一个规则,指定如何将这些C文件编译目标文件(.o),然后链接成最终的可执行文件。 以下是一个简单的Makefile示例,它展示了如何编译多个C源文件: ```makefile # 定义编译器 CC=gcc # 定义编译选项 CFLAGS=-Wall # 定义目标可执行文件名 TARGET=your_program # 定义源文件列表 SRCS=main.c utils.c math.c # 定义目标文件列表,由源文件通过替换后缀得到 OBJS=$(SRCS:.c=.o) # 默认目标 $(TARGET): $(OBJS) $(CC) $(CFLAGS) -o $(TARGET) $(OBJS) # 每一个.c文件对应一个.o文件的规则 %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ # 清理编译生成的文件 clean: rm -f $(OBJS) $(TARGET) # 声明伪目标 .PHONY: clean ``` 在这个Makefile中: - `CC` 变量定义了使用的编译器,这里使用的是 `gcc`。 - `CFLAGS` 变量定义了编译选项,这里使用的是 `-Wall` 来开启所有警告。 - `TARGET` 变量定义了最终生成的可执行文件名。 - `SRCS` 变量定义了源文件的列表。 - `OBJS` 变量通过替换 `.c` 后缀为 `.o` 来生成目标文件列表。 - 默认目标依赖于 `$(OBJS)`,当所有的 `.o` 文件是最新的,或者没有任何 `.c` 文件更改过,make命令默认执行的规则将不会执行任何操作。 - `%.o: %.c` 规则说明了如何将每个 `.c` 文件编译成对应的 `.o` 文件。 - `clean` 目标用于删除所有编译生成的文件,这是一个目标,因为它的名字不对应于一个实际的文件名。 - `.PHONY` 声明告诉make,`clean` 是一个目标,确保每次执行 `make clean` 都会运行。 使用这个Makefile,您可以简单地运行 `make` 命令来编译您的程序,或者使用 `make clean` 来清理编译生成的文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值