2013-04-03 243 views
0

我有这样的目录结构:Makefile的错误:没有这样的文件或目录

  • .\src包含了所有的源代码(.h.cpp
  • .\bin应有的一切.o.bin
  • .已有Makefile

这是我目前的Make文件:

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 [email protected] 

$(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的理解,说实话......

+0

相关:因为您正在使用'g ++',所以您应该使用'CXXFLAGS'。另外,[C/C++/Objective C Toolchain Hardening]有一个全新的世界(https://www.owasp.org/index.php/C-Based_Toolchain_Hardening)。自由软件世界的许多人都不理解它。 – jww 2013-04-03 20:29:38

+0

而不是使用$(CC)(并为其分配另一个值,而不是其默认值),您可以使用$(CXX),其默认值通常为g ++。 – kebs 2013-04-03 20:31:21

回答

2

编制应该是这样的正确的路线:

$(BIN_DIR)/%.o: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h 
    $(CXX) -o [email protected] -c $< $(CFLAGS) 

这意味着:“为模式匹配的每个文件‘%的.o’在$(BIN_DIR)中,使用关联的$(SRC_DIR)/%。cpp作为参数进行编译(第一个依赖项)

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

+0

我用你的建议编辑了我的Makefile,现在得到这个错误:'make:***没有规则使目标'../bin/FixedLengthFieldsRecord.o','flrfile'需要。 Stop.' – 2013-04-06 17:51:47

+0

这不是来自我在这里给出的食谱,而是来自'link'食谱:你有以下依赖:'$(OBJ)',它解析为'../bin/FixedLengthFieldsRecord.o '所以搜索一个配方来建立该文件,并且它没有找到任何,因此错误信息。 (OBJ:= $(addprefix ../$(BIN_DIR)/,$(OBJ))'OBJ:= $(addprefix $(BIN_DIR)/,$(OBJ))'应该成为' – kebs 2013-04-08 08:21:46

+0

'。 – kebs 2013-04-08 08:23:25

相关问题