2016-10-17 3 views
1

У меня есть следующие файлы в моих каталогах proj2 и вам необходимо скомпилировать их вместе, чтобы иметь один исполняемый файл.Как сделать makefile для компиляции нескольких файлов .cpp в разных каталогах с помощью одного make-файла?

proj2/main.cpp 
    proj2/model/Player.cpp 
    proj2/model/gameBoard.cpp 
    proj2/controller/TTTController.cpp 
    proj2/Makefile 

Я использую следующую команду внутри своего файла makefile, но он не работает.

all: 
    g++ /project2_p1/main.cpp /project2_p1/controller/TTTController.cpp   /model/gameBoard.cpp /model/Player.cpp -o ttt 
clean: 
    -rm ttt 

Может кто-нибудь помочь мне please.Thank вы

+5

Вам необходимо прочитать базовый учебник терминала командной строки Unix. Как вы думаете, какой ведущий символ '/' означает в пути? –

+2

Вы не можете создать что-то с Make, пока не знаете, как его построить * без * Make. – Beta

ответ

0

я настоятельно рекомендую вам начать обучение make как это один из основных инструментов, которые используют программисты. И, если вы можете узнать C++, вы можете научиться make.

В вашем проекте у вас есть исходные файлы, зарытые в их собственных подкаталогах, поэтому, чтобы найти их все, вы можете использовать команду $(shell find...). То же самое с любыми заголовочными файлами в вашем проекте.

Делая all: целевого прямого он запускается на выполнение, безусловно, и вы теряете преимущество использования make - только компилировать, когда вы что-то изменить.

Сказав, что базовый шаблон, который я предоставляю здесь, можно улучшить, чтобы перекомпилировать только те исходные файлы, которые были изменены, но это упражнение для читателя.

Я думаю, что это должно работать в вашем случае:

# set non-optional compiler flags here 
CXXFLAGS += -std=c++11 -Wall -Wextra -pedantic-errors 

# set non-optional preprocessor flags here 
# eg. project specific include directories 
CPPFLAGS += 

# find cpp files in subdirectories 
SOURCES := $(shell find . -name '*.cpp') 

# find headers 
HEADERS := $(shell find . -name '*.h') 

OUTPUT := ttt 

# Everything depends on the output 
all: $(OUTPUT) 

# The output depends on sources and headers 
$(OUTPUT): $(SOURCES) $(HEADERS) 
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $(OUTPUT) $(SOURCES) 

clean: 
    $(RM) $(OUTPUT) 
0

вот Makefile коды моего minGW проекта:

hepsi: derle calistir 
Nesneler := ./lib/Hata.o ./lib/Hatalar.o ./lib/Dugum.o ./lib/ListeGezici.o ./lib/BagilListe.o 

    derle: 
     g++ -I ./include/ -o ./lib/Hata.o -c ./src/Hata.cpp 
     g++ -I ./include/ -o ./lib/Hatalar.o -c ./src/Hatalar.cpp 
     g++ -I ./include/ -o ./lib/Dugum.o -c ./src/Dugum.cpp 
     g++ -I ./include/ -o ./lib/ListeGezici.o -c ./src/ListeGezici.cpp 
     g++ -I ./include/ -o ./lib/BagilListe.o -c ./src/BagilListe.cpp 
     g++ -I ./include/ -o ./bin/test $(Nesneler) ./src/test.cpp 

    calistir: 
     ./bin/test 

В своем проекте я думаю, что это будет работать;

all: compile run 
Objects := ./lib/Player.o ./lib/gameBoard.o ./lib/TTTController.o 

compile: 
    g++ -I ./include/ -o ./lib/Player.o -c ./model/Player.cpp 
    g++ -I ./include/ -o ./lib/gameBoard.o -c ./model/gameBoard.cpp 
    g++ -I ./include/ -o ./lib/TTTController.o -c .controller/TTTController.cpp 
    g++ -I ./include/ -o ./bin/main $(Objects) ./main.cpp 

run: 
    ./bin/main 

lib В папку содержатся файлы .o. Вы можете выиграть, если хотите. include папка ссылается на ваш заголовок .h или .hpp. Вы можете изменить каждый из них в соответствии с местоположением ваших заголовков.

bin папка содержит файл .exe с именем main.exe. Вы можете изменить или удалить его так:

run: 
    ./main 

Надеюсь, это сработает.

@Galik имеет право. если вы хотите узнать C++, обязательно узнайте make.

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