Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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,我有一个目录结构: \src包含所有源代码(.h和.cpp) \bin应具有所有.o和.bin 具有Makefile 这是我当前的生成文件: CFLAGS = -Wall -pedantic -g CC = g++ EXEC = flrfile SRC_DIR = src BIN_DIR = bin SOURCES := $(wildcard $(SRC_DIR)/*.cpp) OBJ := $(patsubst $(SRC_DIR)/%,%,$(SOURCES)) OBJ := $(pat

我有一个目录结构:

  • \src
    包含所有源代码(
    .h
    .cpp
  • \bin
    应具有所有
    .o
    .bin
  • 具有
    Makefile
这是我当前的生成文件:

CFLAGS = -Wall -pedantic -g
CC = g++
EXEC = flrfile
SRC_DIR = src
BIN_DIR = bin
SOURCES := $(wildcard $(SRC_DIR)/*.cpp)
OBJ := $(patsubst $(SRC_DIR)/%,%,$(SOURCES))
OBJ := $(patsubst %.cpp,%.o,$(OBJ))
OBJ := $(addprefix ../$(BIN_DIR)/,$(OBJ))

all: flrfile

../$(BIN_DIR)/%.o: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h
    $(CC) $(CFLAGS) -c $(SRC_DIR)/%.cpp -o $@

$(EXEC): $(OBJ)
    @mkdir -p $(BIN_DIR)
    $(CC) $(CFLAGS) $(BIN_DIR)/$(OBJ) -o $(BIN_DIR)/$(EXEC)

.PHONY : clean

clean:
    -rm -rf $(BIN_DIR)
当我运行
make
时,出现以下错误:

g++ -Wall -pedantic -g -c src/%.cpp -o ../bin/FixedLengthFieldsRecord.o
g++: error: src/%.cpp: No such file or directory
g++: fatal error: no input files
compilation terminated.
make: *** [../bin/FixedLengthFieldsRecord.o] Error 4

为什么会这样?老实说,我对Makefile几乎没有了解…

编译的正确行应该如下所示:

$(BIN_DIR)/%.o: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h
    $(CXX) -o $@ -c $< $(CFLAGS)
$(BIN_DIR)/%.o:$(SRC_DIR)/%.cpp$(SRC_DIR)/%.h
$(CXX)-o$@-c$<$(CFLAGS)
这意味着:“对于与$(BIN_DIR)中的模式“%.o”匹配的每个文件,使用关联的$(SRC_DIR)/%.cpp作为参数编译它(第一个依赖项)


附加注释:我怀疑缺少一些依赖项:通常,.c或cpp源文件不仅仅依赖于相应的头文件,还可能包括项目中的其他头文件。

相关:由于您使用的是
g++
,因此应该使用
cxflags
。此外,还有一个全新的工作在自由软件世界中,很多人都不知道它。你可以使用$(CXX),而不是使用$(CC)(并为它指定一个默认值以外的值),其默认值通常为g++。我根据您的建议编辑了我的Makefile,现在得到了以下错误:
make:**没有规则使目标“../bin/FixedLengthFieldsRecord.o”成为“flrfile”所需。停止。
这不是来自我在这里给出的配方,而是来自“link”配方:您有以下依赖项:
$(OBJ)
,解析为类似于
。/bin/FixedLengthFieldsRecord.o
的内容,因此make搜索一个配方来构建该文件,但没有找到任何配方,因此出现错误消息。替换
OBJ:=$(addprefix../$(bin_DIR)/,$(OBJ))
by
OBJ:=$(addprefix$(bin_DIR)/,$(OBJ))
应该可以。现在我得到了
致命错误:无法创建bin/FixedLengthFieldsRecord.o:没有这样的文件或目录
:(文件夹
bin
存在吗?