Max*_*Max 11 c makefile gnu-make
我所拥有的是一个包含3个子目录的目录.src/for .c和.h文件,bin /编译后的可执行文件应该去的地方和obj /我希望.obj文件去的地方.
现在我希望makefile从src编译每个.c文件(不需要在makefile中列出所有文件)并将.o文件放在obj中,将从foo.c构建的可执行文件保存为bin/foo.
有人可以帮我吗?每当我使用通配符时,抱怨规则不存在,当我使用隐式规则时,它不会将目标文件放在单独的文件夹中.
Bet*_*eta 27
要建立foo.o从foo.c,本地:
foo.o: foo.c
$(CC) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)
要做同样的事情,但在任何需要的头文件src/:
SRC := src
foo.o: foo.c
$(CC) -I$(SRC) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)
要做同样的事情,但使用源文件src/:
SRC := src
foo.o: $(SRC)/foo.c
$(CC) -I$(SRC) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)
为此,但将目标文件放在obj/:
SRC := src
OBJ := obj
$(OBJ)/foo.o: $(SRC)/foo.c
$(CC) -I$(SRC) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)
图案规则将做任何这样的目标文件(obj/foo.o,obj/bar.o,...):
SRC := src
OBJ := obj
$(OBJ)/%.o: $(SRC)/%.c
$(CC) -I$(SRC) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)
要创建所需对象的列表:
SOURCES := $(wildcard $(SRC)/*.c)
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))
Run Code Online (Sandbox Code Playgroud)
并且规则涵盖所有:
all: $(OBJECTS)
Run Code Online (Sandbox Code Playgroud)
把它们放在一起:
SRC := src
OBJ := obj
SOURCES := $(wildcard $(SRC)/*.c)
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))
all: $(OBJECTS)
$(CC) $^ -o $@
$(OBJ)/%.o: $(SRC)/%.c
$(CC) -I$(SRC) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)
请注意,这有一个很大的缺点:是不跟踪头文件的依赖性.这可以自动完成,但这是一个微妙的技巧; 它可以等到你掌握了这么多.