Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在Makefile中更改源位置时无法生成代码?_C++_Makefile - Fatal编程技术网

C++ 为什么在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

当我将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 $(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