【问题标题】:Makefile, find sources in src directory tree and compile to .o in build fileMakefile,在 src 目录树中查找源代码并在构建文件中编译为 .o
【发布时间】:2015-05-11 08:53:18
【问题描述】:

我目前正在尝试为我继承的项目重新编写 makefile,以使源代码树更整洁且更易于使用。目前源码树是这样的:

 Project/
 ----bin/
 ----build/
 ----include/
     ----main.h
     ----part1.h
     ----part2.h
     ----part3.h
 ----src/
     ----main.cpp
     ----part1.cpp
     ----Subdir/
         ----part2.c
     ----Subdir2/
         ----part3.cpp

我想要的是我的 makefile 中的一个规则,它将在我的 src 目录中找到所有 .cpp 和 .c 文件,并将它们编译到构建目录中的对象的平面目录中。目前我的makefile中有以下内容,但这似乎错过了一些cpp文件:

BUILDDIR = build

$(BUILDDIR)/%.o :       src/**/%.cpp | $(BUILDDIR)
$(BUILDDIR)/%.o :       src/%.cpp    | $(BUILDDIR)
    $(CXX) $(CFLAGS) -c $< -o $@ $(INCS)

$(BUILDDIR)/%.o :       src/**/%.c   | $(BUILDDIR)
$(BUILDDIR)/%.o :       src/%.c      | $(BUILDDIR)
    $(CC)  $(CFLAGS) -c $< -o $@ $(INCS)

在我运行 make -n 的那一刻,它似乎检测到了 main.cpp 和 part1.cpp,但没有检测到子目录中的。然后 Make 继续尝试根据 Makefile 中的后续规则加载文件。

由于项目中的文件数量,我宁愿不手动编写它们的列表,但如果涉及到,我可能不得不这样做。

【问题讨论】:

    标签: c++ c makefile


    【解决方案1】:

    您可以使用源文件显式定义目录。例如:

    DIRS = src src/subdir1 src/subdir2
    SEARCHC = $(addsuffix /*.c ,$(DIRS))
    SEARCHCPP = $(addsuffix /*.cpp ,$(DIRS))
    SRCS = $(wildcard $(SEARCHC))
    SRCS += $(wildcard $(SEARCHCPP))
    

    并让make 找到您的源文件添加到您的 Makefile:

    vpath %.c $(DIRS)
    vpath %.cpp $(DIRS)
    

    我也在使用特殊目标来检查我的 Makefile:

    help:
        @echo 'Sources:'
        @echo $(SRCS)
    

    【讨论】:

      【解决方案2】:

      Make 的 wildcard 函数可能对你有用。

      另见

      Sources from subdirectories in Makefile

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-21
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2021-05-10
        • 1970-01-01
        相关资源
        最近更新 更多