Makefile子目录递归

时间:2016-11-12 11:12:12

标签: c++ c recursion makefile subdirectory

我有一个带有subdir的项目的makefile问题。 项目目录树如下:

project
├── Makefile
├── main.cpp
|
├── lib1
│   ├── lib1.cpp
│   ├── lib1.h
│   └── Makefile
|
├── lib2
│   ├── Makefile
│   ├── lib2_1.cpp
│   ├── lib2_1.h
|   ├── lib2_2.cpp
│   └── lib2_2.h
| 
├── lib3
│   ├── Makefile
│   ├── lib3.cpp
│   └── lib3.h

每个子目录(lib1,lib2 ...)的makefile是这样的:

SRC_DIR = ./
BUILD_DIR = ./obj/

DEPS = lib1.o

all: $(BUILD_DIR)$(DEPS)

$(BUILD_DIR)%.o: $(SRC_DIR)%.cpp $(SRC_DIR)%.h
     mkdir -p $(BUILD_DIR)
     g++ --std=c++11 $< -c -o $@

clean:
     rm -fr $(BUILD_DIR)

我的问题是:如何创建位于项目目录中的make文件,或makefile“root”? 我无法创建一个以递归方式在子目录中执行makefile的makefile,并链接每个子目录的obj文件夹中的所有目标文件。

你能帮帮我吗?请

1 个答案:

答案 0 :(得分:0)

我会这样做:

SUBDIRS = lib1 lib2 lib3

main: main.cpp $(SUBDIRS)
        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(wildcard $(addsuffix /obj/*.o,$(SUBDIRS))) $(LDLIBS)

.PHONY: $(SUBDIRS)
$(SUBDIRS):
        $(MAKE) -C $@

关于这一点的好处:它可以与make -jN一起用于并行构建,如果你只想构建一个子目录,你可以运行make lib1等。

关于此的错误:每次运行main时,它都会重新关联make程序,即使没有任何更改。

如果你想避免坏事,你可能会考虑使用非递归的makefile,这需要在某种程度上重写你的makefile。

如果您愿意为每个子目录创建一个静态库,以目录命名(所以,liblib1.a等)而不是链接所有目标文件本身,您可以使它可以使用递归makefile。诀窍是根makefile必须能够自己推断或计算库的名称。它无法使用wildcard等来查找它们。