Makefile:自动编译所有c文件,将.o文件保存在单独的文件夹中

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.ofoo.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)

请注意,这有一个很大的缺点:是不跟踪头文件的依赖性.这可以自动完成,但这是一个微妙的技巧; 它可以等到你掌握了这么多.

  • 谢谢你的精彩回答。最后一个片段实际上不会构建可执行文件,但是添加它没有问题,所有文件都在我想要的位置:) (2认同)
  • @activedecay:看看[疯狂科学家的优秀论文](http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/)。并且请学会使用标点符号和大写字母。 (2认同)