使用Gnu make实用程序自动生成与源代码具有不同生成结构的文件 < >我看到了以下技术,用于自动编译所有C(或C++,或者假设您想要的扩展)文件在特定目录中。 SOURCE_DIRS = . SOURCES := $(subst ./,,$(wildcard $(SOURCE_DIRS:=/*.cpp))) HEADERS := $(subst ./,,$(wildcard $(SOURCE_DIRS:=/*.h))) OBJECTS := $(addprefix build/,$(SOURCES:.cpp=.o)) CXX = g++ CXXFLAGS = -Wall -pedantic -g #LDFLAGS = all: build/exe_name build/exe_name: $(OBJECTS) $(CXX) -o $@ $(OBJECTS) $(LDFLAGS) build/%.o: %.cpp $(HEADERS) Makefile mkdir -p $(dir $@) $(CXX) -o $@ $(CXXFLAGS) -c $< SOURCE\u DIRS=。 源代码:=$(子代码/,$(通配符$(源代码:=/*.cpp))) 头文件:=$(子文件/,$(通配符$(源文件:=/*.h))) 对象:=$(addprefix build/,$(源:.cpp=.o)) CXX=g++ CXXFLAGS=-Wall-pedantic-g #LDFLAGS= 全部:生成/exe\u名称 生成/执行名称:$(对象) $(CXX)-o$@$(对象)$(LDFLAGS) 生成/%.o:%.cpp$(标头)生成文件 mkdir-p$(dir$@) $(CXX)-o$@$(CXXFLAGS)-c$

使用Gnu make实用程序自动生成与源代码具有不同生成结构的文件 < >我看到了以下技术,用于自动编译所有C(或C++,或者假设您想要的扩展)文件在特定目录中。 SOURCE_DIRS = . SOURCES := $(subst ./,,$(wildcard $(SOURCE_DIRS:=/*.cpp))) HEADERS := $(subst ./,,$(wildcard $(SOURCE_DIRS:=/*.h))) OBJECTS := $(addprefix build/,$(SOURCES:.cpp=.o)) CXX = g++ CXXFLAGS = -Wall -pedantic -g #LDFLAGS = all: build/exe_name build/exe_name: $(OBJECTS) $(CXX) -o $@ $(OBJECTS) $(LDFLAGS) build/%.o: %.cpp $(HEADERS) Makefile mkdir -p $(dir $@) $(CXX) -o $@ $(CXXFLAGS) -c $< SOURCE\u DIRS=。 源代码:=$(子代码/,$(通配符$(源代码:=/*.cpp))) 头文件:=$(子文件/,$(通配符$(源文件:=/*.h))) 对象:=$(addprefix build/,$(源:.cpp=.o)) CXX=g++ CXXFLAGS=-Wall-pedantic-g #LDFLAGS= 全部:生成/exe\u名称 生成/执行名称:$(对象) $(CXX)-o$@$(对象)$(LDFLAGS) 生成/%.o:%.cpp$(标头)生成文件 mkdir-p$(dir$@) $(CXX)-o$@$(CXXFLAGS)-c$,makefile,compilation,makefile-project,Makefile,Compilation,Makefile Project,唯一的问题是,它以与源目录相同的结构构建所有文件。因此,如果您有一个包含代码的子文件夹,那么构建将有一个匹配的子文件夹 那么,我如何修改它(或者做其他什么),使所有输出的目标直接放在build/目录中,而不是放在与源目录匹配的层次结构中 我曾考虑过在目标中使用“%”时尝试剥离其中可能出现的任何目录,但找不到任何好的命令来执行此操作。另外,在创建时尝试更改对象路径似乎有点问题,因为我不知道“%”变量是如何读取它的,只是它正在神奇地编译对象列表中的所有内容 感谢您提供的任何帮助。按顺序 我不明白这是

唯一的问题是,它以与源目录相同的结构构建所有文件。因此,如果您有一个包含代码的子文件夹,那么构建将有一个匹配的子文件夹

那么,我如何修改它(或者做其他什么),使所有输出的目标直接放在build/目录中,而不是放在与源目录匹配的层次结构中

我曾考虑过在目标中使用“%”时尝试剥离其中可能出现的任何目录,但找不到任何好的命令来执行此操作。另外,在创建时尝试更改对象路径似乎有点问题,因为我不知道“%”变量是如何读取它的,只是它正在神奇地编译对象列表中的所有内容

感谢您提供的任何帮助。

按顺序

  • 我不明白这是怎么回事。您的通配符方法将不会递归到源文件夹的子文件夹中,并且%.o规则在除“source_DIRS=.”之外的任何情况下都不起作用。
  • 你的%.o规则有点松。如果更改一个标头,Make将重建所有对象文件。
  • 将所有可以找到的源代码合并到可执行文件中可能并不明智。在这个方案中,很难有多个共享代码的可执行文件。
  • 为了克服1)中的问题并编写一个可以测试的makefile,我必须处理“find”,我讨厌它,因此下面的内容未经测试。
  • 我认为这可以做到(在GNUMake中):
    最简单的方法(虽然不是严格意义上的“仅制造”)是使用
    automake
    ,而不是设置
    subdir选项
    选项。

    为什么要这样做?这意味着,如果您在不同的子目录中有两个同名的源文件,您将得到神秘的破坏。
    SOURCES := whatever...
    vpath %.cpp $(dir $(SOURCES))
    SOURCES := $(notdir $(SOURCES))