使用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$
唯一的问题是,它以与源目录相同的结构构建所有文件。因此,如果您有一个包含代码的子文件夹,那么构建将有一个匹配的子文件夹 那么,我如何修改它(或者做其他什么),使所有输出的目标直接放在build/目录中,而不是放在与源目录匹配的层次结构中 我曾考虑过在目标中使用“%”时尝试剥离其中可能出现的任何目录,但找不到任何好的命令来执行此操作。另外,在创建时尝试更改对象路径似乎有点问题,因为我不知道“%”变量是如何读取它的,只是它正在神奇地编译对象列表中的所有内容 感谢您提供的任何帮助。按顺序使用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/目录中,而不是放在与源目录匹配的层次结构中 我曾考虑过在目标中使用“%”时尝试剥离其中可能出现的任何目录,但找不到任何好的命令来执行此操作。另外,在创建时尝试更改对象路径似乎有点问题,因为我不知道“%”变量是如何读取它的,只是它正在神奇地编译对象列表中的所有内容 感谢您提供的任何帮助。按顺序 我不明白这是
最简单的方法(虽然不是严格意义上的“仅制造”)是使用
automake
,而不是设置subdir选项
选项。为什么要这样做?这意味着,如果您在不同的子目录中有两个同名的源文件,您将得到神秘的破坏。
SOURCES := whatever...
vpath %.cpp $(dir $(SOURCES))
SOURCES := $(notdir $(SOURCES))