2016-11-15 144 views
6

我一直在寻找这个小时,但不知何故,我仍然没有找到适合我的东西。Makefile:自动编译所有c文件,将.o文件保存在单独的文件夹中

我所拥有的是一个有3个子目录的目录。 src/for .c和.h文件,bin /编译的可执行文件应该去的位置以及obj /我希望.obj文件去的地方。

现在我想让makefile从src中编译每个.c文件(不需要我将它们全部列在makefile中),并将.o文件放在obj中,并将由foo.c构建的可执行文件保存为bin/foo 。

有人可以帮我吗?每当我使用通配符时,都会抱怨规则不在那里,当我使用隐式规则时,它不会将对象文件放在单独的文件夹中。

回答

9

foo.c建立foo.o,本地:

foo.o: foo.c 
    $(CC) -c $< -o [email protected] 

为了做同样的,但在src/任何需要的头文件:

SRC := src 

foo.o: foo.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

做相同,但与源文件在src/

SRC := src 

foo.o: $(SRC)/foo.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

要做到这一点,但放在obj/对象文件:

SRC := src 
OBJ := obj 

$(OBJ)/foo.o: $(SRC)/foo.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

图案规则将做任何这样的目标文件(obj/foo.oobj/bar.o,...):

SRC := src 
OBJ := obj 

$(OBJ)/%.o: $(SRC)/%.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

要创建所需的对象列表:

SOURCES := $(wildcard $(SRC)/*.c) 
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES)) 

而要覆盖所有的规则:

all: $(OBJECTS) 

全部放在一起:

SRC := src 
OBJ := obj 

SOURCES := $(wildcard $(SRC)/*.c) 
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES)) 

all: $(OBJECTS) 
    $(CC) $^ -o [email protected] 

$(OBJ)/%.o: $(SRC)/%.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

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

+0

谢谢你的精彩答案。最后的代码片段实际上并不会构建可执行文件,但添加了这个代码并没有问题,并且所有的文件都是我想让它们成为的地方:) – Max

+0

最后一个模式规则可能会看起来更好,因为静态模式规则是可以接受的。 – bobbogo

+0

@bobbogo:我同意,但我试图简单。 – Beta

相关问题