makefile:如何让它知道我的标题在哪里

时间:2014-08-07 22:50:14

标签: makefile g++

假设我的主目录中有以下文件结构

.
|-- foo
|   `-- lib
|       |-- bar.cpp
|       `-- bar.h
|-- baz
|   |-- qux.cpp
|   `-- qux.h
|-- projects
|   `-- src
|       |-- makefile
`       `-- main.cpp

并且main.cpp看起来像

#include "bar.h"
#include "qux.h"
// does stuff

我的makefile应该是什么样的?

现在,它类似于以下内容

CC = g++
DEBUG = -g -Wall
STD = -std=c++11
OPTIMIZE = -O0
FOO_LIB = $$HOME/foo/lib
BAZ_LIB = $$HOME/baz
INCLUDES = -I$(FOO_LIB) -I$(BAZ_LIB)
LFLAGS = $(DEBUG) $(STD) $(OPTIMIZE) $(INCLUDES)
CFLAGS = -c $(LFLAGS)
BIN = $$HOME/my-program

OBJ = main.o \
    bar.o \
    qux.o

all: $(OBJ)
    $(CC) $(LFLAGS) $(OBJ) -o $(BIN)

main.o: main.cpp bar.h qux.h
    $(CC) $(CFLAGS) main.cpp bar.h qux.h

bar.o: bar.cpp bar.h
    $(CC) $(CFLAGS) bar.cpp bar.h

qux.o: qux.cpp qux.h
    $(CC) $(CFLAGS) qux.cpp qux.h

clean:
    \rm *.o
    \rm *.gch

但是当我尝试时,我得到了

make: *** No rule to make target 'bar.h', needed by 'main.o'.  Stop.

如何让make知道我的头文件在哪里?即使我改变了 main.o

main.o: main.cpp $(FOO_LIB)/bar.h $(BAZ_LIB)/qux.h
    $(CC) $(CFLAGS) main.cpp $(FOO_LIB)/bar.h $(BAZ_LIB)/qux.h

它似乎无法工作(至少对于我更复杂的真实makefile) 即使它确实有效,但似乎还有太多的精神开销 确保所有依赖项都正确加上前缀的条款。 (我拿了一个 查看http://mad-scientist.net/make/autodep.html,但sed内容 这是非常难以理解的,我想了解我在做什么 所以我可以记录它。)

@Etan Reisner 让我们假设 m 库目录中的main.cpp #include n 标头。 这是否意味着我的main.o食谱看起来像这样

main.o: main.cpp \
        /path/to/foo1/bar1.h \
        ...
        /path/to/foo1/barI.h \
        ...
        /path/to/fooM/baz1.h \
        ...
        /path/to/fooM/bazJ.h
    $(CC) $(CFLAGS) main.cpp

如果是这样,那看起来就像很多重复的工作。有一个直截了当的 简化那种方式?

0 个答案:

没有答案