2013-11-03 98 views
1

我們正試圖在Ubuntu服務器上放置Makefile。C++ Makefile錯誤:無法制定目標

的文件結構是這樣的:

/project 
Makefile 
/files 
    /src 
    [all .cpp files, including main.cpp] 
    /include 
    [all .h files] 
    /obj 

端子輸出:

化妝:*沒有規則,使目標files/obj/%.o', needed by SAS'。停止。

我的Makefile:

CC=g++ 
CFLAGS=-c -Wall 
OBJECTS=main.o Parser.o People.o Person.o Queries.o Relation.o 
SOURCES=main.cpp Parser.cpp People.cpp Person.cpp Queries.cpp Relation.cpp 

all: sas 

sas: files/obj/%.o 
     $(CC) $(OBJECTS) -o sas 

files/obj/%.o: files/src/%.cpp 
     $(CC) $(CFLAGS) $(SOURCES) 
+0

您的意思是什麼都沒有的'project'? – Beta

回答

0

這對我們來說是什麼工作:

CC=g++ 
CFLAGS=-c -Wall -std=c++11 
SOURCES=$(wildcard Hackathon/src/*.cpp) 

sas: $(SOURCES:Hackathon/src/%.cpp=Hackathon/obj/%.o) 
     $(CC) $^ -o [email protected] 

Hackathon/obj/%.o: Hackathon/src/%.cpp 
     $(CC) $(CFLAGS) $< -o [email protected] 
1

你不希望手工維護的源列表,你呢?你想

CC=g++ 
CFLAGS=-c -Wall 
SOURCES=$(wildcard files/src/*.cpp) 

sas: $(SOURCES:files/src/%.cpp=files/obj/%.o) 
    $(CC) $^ -o [email protected] 

files/obj/%.o: files/src/%.cpp 
    $(CC) $(CFLAGS) $< -o [email protected] 
2

有與此生成的文件問題很多。修復它們需要很長的時間(我試過了,而且花了數百行),所以我們從頭開始。如果我們手動完成,我們將如何構建這個可執行文件?就像這樣:

g++ -c -Wall files/src/main.cpp -o files/obj/main.o 
g++ -c -Wall files/src/Parser.cpp -o files/obj/Parser.o 
... 
g++ -c -Wall files/src/Relation.cpp -o files/obj/Relation.o 
g++ -Wall files/obj/main.o files/obj/Parser.o ... files/obj/Relation.o -o sas 

要構建的目標文件,我們寫了一個pattern rule,使用automatic variables

CXX=g++ 

files/obj/%.o: files/src/%.cpp 
    $(CXX) -c -Wall $< -o [email protected] 

生成可執行文件,我們使用對象的構造列表:

MODULES = main Parser People Person Queries Relation 
OBJECTS = $(patsubst %, files/obj/%.o, $(MODULES)) 

sas: $(OBJECTS) 
    $(CXX) $^ -o [email protected] 

請注意,根本不需要SOURCES我認爲保持生成文件中的源代碼或對象列表是一個好主意(因爲這樣多個項目可以共享源文件而不會使目錄結構複雜化),但是沒有理由維護兩個這樣的列表。