具有不同目录的C makefile

时间:2018-07-23 15:51:14

标签: c makefile

我目前正试图了解Makefile。我已经阅读了一些教程,并且也了解了GNU Make Manual。但是我仍然不知道如何解决我的问题。

我有以下结构:

makefile
main.c
|_ test
   |_ hello.c
   |_ hello.h

在测试文件夹中,有一个C文件,其中包含我想在主要位置使用的方法。


我的Makefile如下

CC = gcc
CFLAGS = -Itest/

# Include dir
INC = test

# Messing around with sources to get the file paths
_SRC = hallo.c
tmp  = $(patsubst %, $(INC)/%, $(_SRC))
SRC = main.c
SRC += $(tmp)

# output
$(info $$var is [${SRC}])

_DEPS = hello.h
DEPS = $(patsubst %, $(INC)/%, $(_DEPS))

ODIR = obj
_OBJ = main.o hello.o
OBJ = $(patsubst %, $(ODIR)/%,$(_OBJ))

# Not sure if the $(DEPS) does anything here
$(ODIR)/%.o : $(SRC)  $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

build : $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS)


.PHONY: clean

clean :
    -rm *.o
    -rm $(ODIR)/*.o
    rm build

我在此处添加了一些评论,以便您了解我的尝试。如果有人能告诉我我做错了事,我将不胜感激。


我的问题在这里

# Not sure if the $(DEPS) does anything here
$(ODIR)/%.o : $(SRC)  $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

我知道 $ << / strong>是 $(SRC)的第一个参数,但这不是我所需要的。但是我莫名其妙地错过了如何使用一个接一个的条目。

我还没有得到的另一件事是 $(DEPS)DEPS是否存在也没有区别(据我从新手的角度来看)。

请分享您的智慧。

1 个答案:

答案 0 :(得分:0)

我认为您太努力了。让我们先说明您想为自己做些什么,然后再考虑如何对其进行概括。

# it seems Test.Dir is an include directory
TEST.DIR = test

# use modern C
CC = gcc -std=c11
# make gdb more convenient to use, and supply an include directory
CFLAGS = -g -O0 -I$(TEST.DIR)

# the main output is "main"
# it depends on main.c and hello.c
# let make compile .c to .o on its own, using built-in rules, if that's enough

main: main.o $(TEST.DIR)/hello.o
    $(CC) -o $@ $(CFLAGS) $^

# remind make that hello.o also depends on hello.h
$(TEST.DIR)/hello.o: $(TEST.DIR)/hello.h

# is it also true that main.c includes hello.h?  
# then say so, else you don't need the -I option

main.o: $(TEST.DIR)/hello.h

有两种方法可以生成包含文件相关性。我自己使用mkdep;也可以将gcc用于相同的目的。

模式替换功能功能强大,但容易出错。尝试使事情尽可能简单,并仅在捕获模式的地方引入函数,以节省您的键入时间(并可能在这样做时引入错误)。