没有规则来制作目标.o,为啥?
Posted
技术标签:
【中文标题】没有规则来制作目标.o,为啥?【英文标题】:No rule to make target .o, why?没有规则来制作目标.o,为什么? 【发布时间】:2018-06-02 14:18:42 【问题描述】:这是我人生中的第一个makefile!我有一个项目,其中有 src 文件夹(我保存我的 .cpp 文件),一个 include 文件夹(我保存我的 .hpp 文件)和我想在其中存储我的目标文件的 build 文件夹。
# define the C compiler to use
CCXX = g++ -std=c++11
# define any compile-time flags
CXXFLAGS = -g -Wall
# define any directories containing header files other than /usr/include
INCLUDES = -I./include
#define the directory for src files
SRCDIR = ./src/
#define the directive for object files
OBJDIR = ./build/
# define the C source files
SRCS = action.cpp conditionedBT.cpp control_flow_node.cpp execution_node.cpp main.cpp
# define the C object files
OBJS = $(OBJDIR)$(SRCS:.cpp=.o)
# define the executable file
MAIN = out
.PHONY: depend
all: $(MAIN)
@echo Program compiled
$(MAIN): $(OBJS)
$(CCXX) $(CXXFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS)
$(OBJDIR)/%.o: ($SRCDIR)/%.c
$(CCXX) $(CXXFLAGS) $(INCLUDES) -c -o $@ $<
#.c.o:
# $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
#clean:
# $(RM) *.o *~ $(MAIN)
depend: $(addprefix $(SRCDIR),$(SRCS))
makedepend $(INCLUDES) $^
# DO NOT DELETE THIS LINE -- make depend needs it
鉴于上述情况,当我尝试执行 make 时出现以下错误:
make: *** No rule to make target `build/action.o', needed by `out'. Stop.
【问题讨论】:
.c
与 .cpp
不同。
CC
, CFLAGS
用于 C,因此默认规则也不会拾取它。最好使用CXX
、CXXFLAGS
。
【参考方案1】:
您的Makefile
存在一些问题。
1)当您的文件使用.cpp
时,您使用的是.c
扩展名。
2) 您的替换指令OBJS = $(SRCS:.c=.o)
没有考虑您的源和对象的子目录。
3)您制作对象的一般规则不会因为这些原因而被调用,还因为您没有指定源的子目录。
因为make
正在制定自己的规则来编译您的对象并忽略您制定的规则。
我还建议为C++
使用正确的隐式变量,这将使隐式规则更好地工作。
这里有详细介绍:https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
所以我会推荐更像这样的东西:
# define the C compiler to use
CXX = g++
# define any compile-time flags
CXXFLAGS = -std=c++11 -g -Wall
# define any directories containing header files other than /usr/include
CPPFLAGS = -I./include
#define the directive for object files
OBJDIR = ./build
SRCDIR = ./src
# define the C source files
SRCS = $(SRCDIR)/action.cpp $(SRCDIR)/main.cpp
# define the C object files
OBJS = $(patsubst $(SRCDIR)/%.cpp,$(OBJDIR)/%.o,$(SRCS))
# define the executable file
MAIN = out
.PHONY: depend
all: $(MAIN)
@echo Program compiled
$(MAIN): $(OBJS)
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $(MAIN) $(OBJS)
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
@echo "Compiling: " $@
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<
clean:
$(RM) $(OBJDIR)/*.o *~ $(MAIN)
depend: $(SRCS)
makedepend $(INCLUDES) $^
# DO NOT DELETE THIS LINE -- make depend needs it
【讨论】:
以上是关于没有规则来制作目标.o,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
gcc makefile错误:“没有规则来制作目标......”
make[1]: *** 没有规则来制作 `firmware/am335x-pm-firmware.bin.gen.o' 需要的目标 `firmware/am335x-pm-firmware.bin'