假设我的主目录中有以下文件结构
.
|-- 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
如果是这样,那看起来就像很多重复的工作。有一个直截了当的 简化那种方式?