2013-04-03 271 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

相關問題