【问题标题】:Makefile to get source files in multiple subdirectoriesMakefile 获取多个子目录中的源文件
【发布时间】:2021-12-09 10:16:09
【问题描述】:

我正在创建自定义 Makefile 来构建 C++ Linux 应用程序。我的 cpp 源文件位于与 Makefile 相同级别的名为 src 的文件夹中。到目前为止,我已经能够使用以下内容构建我的目标文件:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp | $(OBJ_DIR)
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ 

现在我的项目开始变得有点复杂,我想要 src 中的子目录,例如 src/common ,而且,不是每个文件都是 cpp 文件现在也是一个 c 文件。

我想每个子目录都有一个单独的 Makefile 是最好的方法,但我现在只用一个 Makefile 来保持这个简单。

我尝试了以下但不起作用

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(SRC_DIR)/common/%.cpp $(SRC_DIR)/common/%.c | $(OBJ_DIR)
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

我可以让 Makefile 执行 shell find 来查找所有 cpp 和 c 文件,但也试图避免这种情况。

如果有任何建议,我将不胜感激。

【问题讨论】:

  • “更简单”的解决方案通常是嵌套的 makefile。许多较小的文件仍然比一个庞然大物的文件更容易管理。但我会更进一步说,忘记这一点,改用 cmake 或 meson 之类的构建系统。
  • this 的变体在我的经验中也很有效。

标签: c++ linux gcc makefile g++


【解决方案1】:

这个:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(SRC_DIR)/common/%.cpp $(SRC_DIR)/common/%.c | $(OBJ_DIR)

无法工作;它说的是如果make想要构建一些文件$(OBJ_DIR)/XXX.o并且没有明确的规则,那么当且仅当 ALL先决条件$(SRC_DIR)/XXX.cpp$(SRC_DIR)/common/XXX.cpp , and $(SRC_DIR)/common/XXX.c 存在或者可以被make创建,那么规则就会匹配。

如果可以从多个不同的先决条件构建相同的目标,您必须创建多个规则,每个先决条件一个。

此外,使用相同的配方编译 C 文件 (.c) 和 C++ 文件 (.cpp) 是没有意义的。 C++ 编译器使用变量CXXCXXFLAGS,C 编译器使用变量CCCFLAGS

至于避免find,您无法避免以某种方式告知make您要编译哪些文件。您要么必须在您的 makefile 中明确列出它们,要么使用某种方法动态生成它们。没有办法解决这个问题。如果您不想使用,则不必使用find;例如,如果您知道所有文件将是一个或两个目录,您可以使用wildcard,例如:

SRCS := $(wildcard $(SRC_DIR)/*.cpp $(SRC_DIR)/*.c $(SRC_DIR)/*/*.cpp $(SRC_DIR)/*/*.c)

【讨论】:

  • 谢谢。我对 Make 很陌生。然后我在它之后有以下行,它描述了目标文件 OBJ := $(SRC:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o) 。然后如何修改它以考虑找到的所有 cpp 和 c 文件,而不仅仅是 src 中的那些 cpp 文件?
  • 我推荐类似OBJ := $(patsubst $(SRC_DIR)/%,$(OBJ_DIR)/%,$(addsuffix .o,$(basename $(SRC))))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 2020-11-24
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多