2016-05-29 130 views
1

我開始研究一個小項目來實現C++中的todo應用程序。MakeFile只編譯一個文件

我寫了一個Makefile來編譯我的C++文件,但Makefile只編譯main.cc而沒有其他東西。

這裏是我的生成文件

#MakeFile for Building the ToDoList App 

# Compile CXX Files 
CXX := g++-4.9 
CXXFLAGS := -std=c++11 
CXXFILES := $(wildcard src/*.cc src/lexer/*.cc) 
CXXOBJECTS := $(CXXFILES:.cc=.o) 
CXXHEADERS := $(wildcard *.h) 

# Link all Object Files 
LD := ld 
LDFLAGS := 

# Declare Clean and Run as Phony Targets 
.PHONY: clean run 

# The Final Product will be the To-Do APP 
all: TedO.app 

# Compile the ToDO APP 
TedO.app: $(CXXOBJECTS) 
      $(LD) $(LDFLAGS) -o build/[email protected] $^ 

# Run the APP from the Build Folder 
run: TedO.app 
    ./build/$^ 

# Compile the CC files into Object files and place it into the same directory. 
%.o: %.cc 
    $(CXX) $(CXXFLAGS) -o [email protected] $< 

# Clean all the Objects 
clean: $(CXXOBJECTS) 
     rm $^ 

這裏是我的目錄結構

. 
├── Makefile 
├── Makefile.swp 
├── build 
│   ├── tedo 
│   └── tedo.txt 
├── doc 
├── src 
│   ├── lexer 
│   │   ├── lexer.cc 
│   │   └── lexer.h 
│   └── main.cc 
└── tree.txt 

4 directories, 8 files 

這裏運行,當我從控制檯輸出使

g++-4.9 -std=c++11 -o src/main.o src/main.cc 
Undefined symbols for architecture x86_64: 
    "lexer::lexer()", referenced from: 
     _main in ccmWqgIU.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 
make: *** [src/main.o] Error 1 

回答

2

擺脫你的編譯模式規則

%.o: %.cc 
    $(CXX) $(CXXFLAGS) -o [email protected] $< 

Make已經有一個適用於.cc文件的內置規則(您忘記添加-c標誌來阻止GCC鏈接)。

有一些更多的問題與你的Makefile:你對Ted0.app規則是錯誤的,因爲你實際上是鏈接build/Ted0.app,你的clean規則將重拍所有的目標文件刪除之前。

CXX := g++-4.9 
CXXFLAGS := -std=c++11 
CXXFILES := $(wildcard src/*.cc src/lexer/*.cc) 
CXXOBJECTS := $(CXXFILES:.cc=.o) 

.PHONY: all run clean 

all: build/TedO.app 

build/TedO.app: CC := $(CXX) 
build/TedO.app: $(CXXOBJECTS) 
    $(LINK.o) $(LDFLAGS) -o [email protected] 

run: build/TedO.app 
    $< 

clean: ; $(RM) $(CXXOBJECTS) 
+0

這是什麼;乾淨的意思是? –

+0

@AswinMohan這只是一種在與目標相同的線上寫配方的方法,';'之後的任何內容都是第一個配方。例如'run'可以寫成'run:build/TedO.app; $ <'儘管通常限制這種類型的語法與沒有先決條件的目標相比更好。 – user657267