Makefile无法正常工作

Makefile无法正常工作,makefile,Makefile,我有这个文件夹结构 project |_src | |_test | |_main.cpp |_Makefile 这是我的makefile(尝试从中改编): 我做错了什么?很抱歉提出这个小问题,但我是make新手。错误意味着make无法找到正确的规则来构建对象文件。您的树结构缺少一些信息:只有一个文件?其他人在哪里?无论如何,这里有一些提示: 在最后两行中,您使用的是make:后缀规则。我建议您切换到a,这在功能上是等效的。 比如说: %.o: %.cpp $(CXX) $(CXX

我有这个文件夹结构

project
|_src
| |_test
|   |_main.cpp
|_Makefile
这是我的makefile(尝试从中改编):


我做错了什么?很抱歉提出这个小问题,但我是make新手。

错误意味着make无法找到正确的规则来构建对象文件。您的树结构缺少一些信息:只有一个文件?其他人在哪里?无论如何,这里有一些提示:

在最后两行中,您使用的是make:后缀规则。我建议您切换到a,这在功能上是等效的。 比如说:

%.o: %.cpp
    $(CXX) $(CXXFLAGS) $< -o $@

该错误意味着make无法找到正确的规则来构建对象文件。您的树结构缺少一些信息:只有一个文件?其他人在哪里?无论如何,这里有一些提示:

在最后两行中,您使用的是make:后缀规则。我建议您切换到a,这在功能上是等效的。 比如说:

%.o: %.cpp
    $(CXX) $(CXXFLAGS) $< -o $@

该链接显示过时的方法,例如。gcc/g++也可以在编译过程中生成依赖项

至于其余的,这里是:

EXE:=test
SRCDIR:=src
OBJDIR:=.obj
SRC:=$(shell查找$(SRCDIR)-名称“*.cpp”)
OBJ:=$(SRC:$(SRCDIR)/%cpp=$(OBJDIR)/%0)
部门:=$(对象:.o=.d)
LDLIBS:=#-l标志
LDFLAGS:=#-L个标志
CPPFLAGS:=-MMD-MP#-I也有标志
CXXFLAGS:=-W-Wall#此处无-c标志
.冒牌货:都是干净的
全部:$(EXE)
清洁:
$(RM)-r$(OBJDIR)
清洁:清洁
$(RM)$(EXE)
回复:fclean all
-包括美元(DEP)
$(EXE):$(OBJ)
$(CXX)$(LDFLAGS)$^$(LDLIBS)-o$@
$(OBJDIR)/%.o:$(SRCDIR)/%.cpp
@mkdir-p$(@D)
$(CXX)$(CPPFLAGS)$(CXXFLAGS)-o$@-c$<
没有内部定义变量的重新定义,没有后缀规则,正确的链接步骤和依赖项生成


更新:为避免对每个源文件调用
mkdir
,应使用和特殊目标

更改此块:

$(OBJDIR)/%.o:  $(SRCDIR)/%.cpp
    @mkdir -p $(@D)
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
$(OBJDIR)/%.o:$(SRCDIR)/%.cpp
@mkdir-p$(@D)
$(CXX)$(CPPFLAGS)$(CXXFLAGS)-o$@-c$<
为此:

.SECONDEXPANSION:
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp | $$(@D)/
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<

%/:
    mkdir $*
。第二次扩展:
$(OBJDIR)/%.o:$(SRCDIR)/%.cpp |$$(@D)/
$(CXX)$(CPPFLAGS)$(CXXFLAGS)-o$@-c$<
%/:
mkdir$*

该链接显示过时的方法,例如。gcc/g++也可以在编译过程中生成依赖项

至于其余的,这里是:

EXE:=test
SRCDIR:=src
OBJDIR:=.obj
SRC:=$(shell查找$(SRCDIR)-名称“*.cpp”)
OBJ:=$(SRC:$(SRCDIR)/%cpp=$(OBJDIR)/%0)
部门:=$(对象:.o=.d)
LDLIBS:=#-l标志
LDFLAGS:=#-L个标志
CPPFLAGS:=-MMD-MP#-I也有标志
CXXFLAGS:=-W-Wall#此处无-c标志
.冒牌货:都是干净的
全部:$(EXE)
清洁:
$(RM)-r$(OBJDIR)
清洁:清洁
$(RM)$(EXE)
回复:fclean all
-包括美元(DEP)
$(EXE):$(OBJ)
$(CXX)$(LDFLAGS)$^$(LDLIBS)-o$@
$(OBJDIR)/%.o:$(SRCDIR)/%.cpp
@mkdir-p$(@D)
$(CXX)$(CPPFLAGS)$(CXXFLAGS)-o$@-c$<
没有内部定义变量的重新定义,没有后缀规则,正确的链接步骤和依赖项生成


更新:为避免对每个源文件调用
mkdir
,应使用和特殊目标

更改此块:

$(OBJDIR)/%.o:  $(SRCDIR)/%.cpp
    @mkdir -p $(@D)
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
$(OBJDIR)/%.o:$(SRCDIR)/%.cpp
@mkdir-p$(@D)
$(CXX)$(CPPFLAGS)$(CXXFLAGS)-o$@-c$<
为此:

.SECONDEXPANSION:
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp | $$(@D)/
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<

%/:
    mkdir $*
。第二次扩展:
$(OBJDIR)/%.o:$(SRCDIR)/%.cpp |$$(@D)/
$(CXX)$(CPPFLAGS)$(CXXFLAGS)-o$@-c$<
%/:
mkdir$*

对于您的第一个makefile,您应该尝试更简单的方法。我知道,但这是为了工作。我需要创建这些obj目录。我也尝试过更简单的makefiles,它们很有效,所以我将其传递给了这一个。对于您的第一个makefile,您应该尝试更简单的东西。我知道,但它是用于工作的。我需要创建这些obj目录。我也尝试过更简单的makefiles,它们也可以工作,所以我将其传递给了这一个。谢谢。它在这一行给了我一个错误:
$(RM)-r$(OBJDIR)
错误是
Makefile:21:**缺少分隔符。停止。
OBJDIR存在,我也尝试将
-r
更改为
-fr
StackOverflow自动将制表符转换为空格,但需要制表符,因此您必须在复制/粘贴后修复此问题。@Jepessen如果此答案或其他答案解决了您的问题,您介意接受它来关闭此问题吗?谢谢。它在这一行给了我一个错误:
$(RM)-r$(OBJDIR)
错误是
Makefile:21:**缺少分隔符。停止。
OBJDIR存在,我也尝试将
-r
更改为
-fr
StackOverflow自动将制表符转换为空格,但需要制表符,因此您必须在复制/粘贴后修复此问题。@Jepessen如果此答案或其他答案解决了您的问题,您介意接受它来关闭此问题吗?谢谢。它可以工作,但是.o文件是在
src/test
中创建的。我想在
.obj
文件夹中创建所有
.o
文件,以保持对原始文件夹结构的清理。有可能吗?当然,用
$(OBJ_文件夹)/%.o:$(SRC_文件夹)/%.cpp替换
%.o:%.cpp
,并定义这些变量。谢谢您的帮助。谢谢。它可以工作,但是.o文件是在
src/test
中创建的。我想在
.obj
文件夹中创建所有
.o
文件,以保持对原始文件夹结构的清理。可以吗?当然可以,将
%.o:%.cpp
替换为
$(OBJ_文件夹)/%.o:$(SRC_文件夹)/%.cpp
,并定义这些变量。感谢您的帮助。