我有一个带有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文件夹中的所有目标文件。
你能帮帮我吗?请答案 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
等来查找它们。