我目前正试图了解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
是否存在也没有区别(据我从新手的角度来看)。
请分享您的智慧。
答案 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用于相同的目的。
模式替换功能功能强大,但容易出错。尝试使事情尽可能简单,并仅在捕获模式的地方引入函数,以节省您的键入时间(并可能在这样做时引入错误)。