2016-05-29 11 views
1

が、私はC++でのToDoアプリを実装するために小規模なプロジェクトに取り組んで始めただけで一つのファイルをコンパイルします。Makefileは

私はMakefileののみmain.ccと他には何をコンパイルし、私のC++ファイルをコンパイルするためのMakefileを書きましたけど。ここで

は私のメイクファイルである。ここ

#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] $< 

メイクにはすでに.ccファイルの組み込みルールがあります(GCCのリンクを停止するために-cフラグを追加するのを忘れた場合)。

は、あなたのメイクファイルでさらにいくつかの問題があります:あなたが実際にbuild/Ted0.appをリンクしている、とあなたcleanルールは、それらを削除する前に、すべてのオブジェクトファイルを作り直しますのでTed0.appのためのあなたのルールが間違っています。何

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

。きれいな意味のinfront?それ@AswinMohan –

+0

は、 'の後に何をターゲットと同じライン上のレシピを書いているだけの方法です;'最初のレシピです。たとえば 'run'は' run:build/TedO.app;と書かれます。 $ <'ですが、通常、この種の構文を前提条件を持たないターゲットで制限する方が良いでしょう。 – user657267