【问题标题】:Makefile subdirectory recursiveMakefile子目录递归
【发布时间】:2017-03-26 12:37:07
【问题描述】:

我对带有子目录的项目的 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

每个subdir(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 并链接每个子目录的 obj 文件夹中的所有目标文件的 makefile。

你能帮帮我吗?请

【问题讨论】:

  • 只是一个不能解决你问题的评论。或者也许会? ;) 恕我直言,每个子目录都应该有一个 archive/so 目标,而不是 lib1.o 目标。
  • 为什么每个子目录都应该有一个so目标?
  • 存档/所以,选择一个。我不知道您要构建什么,但您的目录名为 lib[123],所以我假设您正在构建库。
  • 是的,我可以将它们构建为 .so 文件,但是如果我创建 .so 文件,使用“根”makefile 会有所改变?
  • 您不应该创建共享库。这将使您的程序非常复杂,因为您必须将 .so 与您的程序一起提供,确保您的程序可以在运行时找到它们,等等。您可以使用静态库(.a 或档案):这与使用 .o。

标签: c++ c recursion makefile subdirectory


【解决方案1】:

我会这样做:

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 等。

这样做的坏处:每次运行 make 时它都会重新链接 main 程序,即使没有任何改变。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2011-12-23
    • 2011-06-19
    • 2011-03-30
    • 2021-05-19
    • 2016-10-23
    相关资源
    最近更新 更多