C++ 为什么在Makefile中更改源位置时无法生成代码?
当我将cpp文件移出Makefile文件夹时,我在构建cpp文件时遇到问题。有人知道为什么吗 makefile中的代码段:C++ 为什么在Makefile中更改源位置时无法生成代码?,c++,makefile,C++,Makefile,当我将cpp文件移出Makefile文件夹时,我在构建cpp文件时遇到问题。有人知道为什么吗 makefile中的代码段: CC = qcc -Vgcc_nto$(PLATFORM) CXX = qcc -lang-c++ -Vgcc_nto$(PLATFORM) LD = $(CXX) DEPS = -Wp,-MMD,$(@:%.o=%.d),-MT,$@ CFLAGS=-Wall -g -ggdb -O0 DIR_SRC =./ DIR_OBJ =./ SRCS := $(wildcard
CC = qcc -Vgcc_nto$(PLATFORM)
CXX = qcc -lang-c++ -Vgcc_nto$(PLATFORM)
LD = $(CXX)
DEPS = -Wp,-MMD,$(@:%.o=%.d),-MT,$@
CFLAGS=-Wall -g -ggdb -O0
DIR_SRC =./
DIR_OBJ =./
SRCS := $(wildcard $(DIR_SRC)/*.cpp)
OBJECTS := $(SRCS:$(DIR_SRC)/%.cpp=$(DIR_OBJ)/%.o)
all: hello_world_test
$(DIR_OBJ)/%.o : $(DIR_SRC)/%.c
$(CXX) $(CFLAGS) ${CPPFLAGS} ${DEPS} -c $< -o $@
hello_world_test: hello_world_test.o
$(CXX) hello_world_test.o $(LDFLAGS) $(LIBPATH) $(LDLIBS) -o $@
它不再适用于以下消息:
make:**没有规则将目标设置为“hello\u world\u test.o”,这是“hello\u world\u test”所需的。停下来
因为:
hello_world_test: hello_world_test.o
您的hello\u world\u测试取决于hello\u world\u test.o
。但是您的规则告诉make如何构建$(DIR\u OBJ)/%.o
和hello\u world\u test.o
与该模式不匹配。目标中的模式匹配是简单的字符串匹配,它不会简化路径名。你应该将你的先决条件写为:
hello_world_test: $(DIR_OBJ)/hello_world_test.o
请注意,这里有两个斜杠:一个在DIR_OBJ
中,另一个在后面。但无论如何
它以前工作的原因是make使用它的内置配方来构建对象文件,而不是您的配方;内置配方具有以下模式:
%.o : %.c
与您的对象文件匹配。如果您使用-r
选项运行make来删除所有内置规则,您也会看到其中的失败。谢谢您的回答。我发现问题出在规则上,就像你说的。
我改为$(DIR_OBJ)/%.o:$(DIR_SRC)/%.cpp(在它是.c而不是.cpp:)之前),现在它可以用来更改DIR_SRC。
我没有注意到这一点,因为我能够从当前目录构建,但在您回答关于内置规则的问题后才意识到
另一个问题:
1) 这条规则是否:
$(DIR_OBJ)/%.o:$(DIR_SRC)/%.cpp
$(CXX)$(CFLAGS)${CPPFLAGS}${DEPS}-c$<-o$@
接下来说:编译所有的.cpp文件,并从中生成.o文件,然后将.o文件放入DIR_OBJ中
2) 为什么我不能将DIR_OBJ位置更改为例如:
DIR_OBJ=../test,然后使用hello_world_test:$(DIR_OBJ)/hello_world_test.o构建可执行文件
当我这样做时,我得到一个错误:找不到hello\u world\u test。o:没有这样的文件或目录
我看到.o和.d文件是在定义DIR_OBJ的目录中创建的(在./或在../test中),这让我很困惑,为什么hello_world_test不能定义前提$(DIR_OBJ)/hello_world_test.o,但它只在当前文件夹中查找Makefile 我意识到问题出在哪里:
我没有在中添加$(DIR\u OBJ)/hello\u world\u test.o
$(CXX)hello\u world\u test.o$(LDFLAGS)$(LIBPATH)$(LDLIBS)-o$@
但是现在仍然感到困惑,如果我的理解是正确的,$(DIR\u OBJ)/%.o:$(DIR\u SRC)/%.cpp将创建$(DIR\u OBJ)/hello\u world\u test.o为什么hello\u world\u client:$(DIR\u OBJ)/hello\u world\u client.o找不到先决条件
%.o : %.c