更改 makefile 以处理“make all”命令

Posted

技术标签:

【中文标题】更改 makefile 以处理“make all”命令【英文标题】:Change makefile to work on 'make all' command 【发布时间】:2020-04-15 19:15:36 【问题描述】:

所以我已经完成了关于制作数独程序的学校项目,并且我有这个 makefile,当我使用“make”命令时它可以干净地工作。我刚刚发现我需要它在“make all”命令上干净地编译。我不知道如何设置它。有什么建议吗?

CC = gcc
OBJS = main.o MainAux.o game.o parser.o solver.o 
EXEC = sudoku_console
COMP_FLAG = -ansi -Wall -Wextra -Werror -pedantic-errors
GUROBI_COMP = -I/usr/local/lib/gurobi563/include
GUROBI_LIB = -L/usr/local/lib/gurobi563/lib -lgurobi56

$(EXEC): $(OBJS)
    $(CC) $(OBJS) $(GUROBI_LIB) -o $@ -lm
main.o: main.c game.h 
    $(CC) $(COMP_FLAG) -c $*.c
game.o: game.c MainAux.h parser.h solver.h game.h
    $(CC) $(COMP_FLAG) -c $*.c
MainAux.o: MainAux.c game.h
    $(CC) $(COMP_FLAG) -c $*.c
parser.o: parser.c MainAux.h
    $(CC) $(COMP_FLAG) -c $*.c
solver.o: solver.c game.h MainAux.h
    $(CC) $(COMP_FLAG) $(GUROBI_COMP) -c $*.c
clean:
    rm -f $(OBJS) $(EXEC)

【问题讨论】:

【参考方案1】:

只需创建一个名为all 的目标,这取决于您想要发生的任何事情。比如:

all: $(EXEC)
.PHONY: all

.PHONY 卫生良好,但不是严格要求。

现在,当您运行 make all 时,它会找到 all 目标,发现要更新它必须首先更新 $(EXEC) 目标,而 Bob 是您的叔叔!

【讨论】:

谢谢你,这行得通!但我有个问题。当我将第一个目标 $(EXEC): $(OBJS) 更改为 all: ($OBJS) 时,它似乎也可以工作(当然还有可执行的输出名称)。你的提议和这个提议的效果有什么不同吗? 如果您按照自己的方式进行操作并且连续两次运行make 而不更改任何文件,它仍然会在第二次(以及每隔一次)重新链接程序。如果你按照我的方式做,那么第二次(以及后续)它不会做任何事情,因为没有什么可做的。

以上是关于更改 makefile 以处理“make all”命令的主要内容,如果未能解决你的问题,请参考以下文章

missing seperator error when [make all]

UNIX系统中make clear ,make all是啥命令?

如何更改我的 makefile 以进行调试构建?

如何编写makefile来处理头文件中的更改

Makefile 更改以在不同格式的文件之间进行选择

如何更改我的 makefile 以构建到单独的文件夹中