2016-05-29 4 views
1

Я начал работу над небольшим проектом для реализации приложения todo на C++.MakeFile компилирует только один файл

Я написал Makefile для компиляции моих файлов на C++, но Makefile Only компилирует main.cc и ничего больше.

Вот мой 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 файлов, которые работают (вы забыли добавить флаг -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

Что такое; infront чистого значения? –

+0

@AswinMohan Это всего лишь способ написать рецепт на той же линии, что и цель, что-нибудь после ';' является первым рецептом. Например, 'run' можно записать' run: build/TedO.app; $ <', хотя обычно лучше ограничивать этот синтаксис целевыми объектами, которые не имеют необходимых условий. – user657267

Смежные вопросы