c++ - Makefile,在src目录树中查找源代码并在构建文件中编译为.o

标签 c++ c makefile

我目前正在尝试为我继承的项目重写 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 中后面的规则加载文件。

由于项目中的文件数量较多,我不想手动编写它们的列表,但如果真的需要的话,我可能不得不这样做。

最佳答案

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

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)

关于c++ - Makefile,在src目录树中查找源代码并在构建文件中编译为.o,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30163301/

相关文章:

c++ - C++11/C++14 中的文字类型类

c++ - GDI+ 对象的 std::make_unique

c++ - 在 ubuntu 中使用/bin/bash 运行 grep 时,popen 错误重定向意外

c - 结构和刷新(stdin)

c++ - Waitpid 等效于超时?

比较字符串与通配符

objective-c - 将 NSString 转换为 C 字符串,递增并返回到 NSString

cmake - CMake 中 make -k 的等价物是什么?

c - Travis CI - 无法在 makefile 中运行 `c` 可执行文件

c - 使错误别名为 undefined symbol devone_init