2010-04-13 15 views
2

У меня возникли проблемы с созданием Makefile. Напишите сейчас, я все время собираю все. Хотя, профессор в порядке с этим, я хочу, чтобы он работал быстрее и чтобы избежать ненужного компиляции.Не удалось создать файл makefile

Вот что у меня есть.

FILES= p6.cpp SetIter.cpp Node.cpp Set.cpp 
CFLAGS= -ansi -pendantic -Wall -Wextra 
CC= g++ 

MakePg6: p6.cpp SetIter.cpp Node.cpp Set.cpp 
    $(CC) $(CFLAGS) $(FILES) -o pg6 

node.cpp - класс узла

Set.cpp - использует узлы. Друг узла.

SetIter.cpp - получает набор и использует указатель итератора через

Я запутался с некоторыми из depencies, вытекающий из друзей вещи и точек lib.o включаются в Makefile, как некоторые сайты имеют.

Любая помощь очень ценится. Заранее спасибо.

ответ

1

Вы можете упростить вам сделать файл, но с использованием $(FILES) в зависимости от MakePg6 таким образом:

MakePg6: $(FILES) 
    $(CC) $(CFLAGS) $(FILES) -o pg6 

друг часть решается каждый C++ компилируется независимо, и файлы заголовков определяют все информация должна скомпилировать этот файл. Компилятор применяет правила друзей. Компилятор объединяет результирующий объект вместе, чтобы сделать полученный исполняемый файл.

В lib.o включено, потому что люди используют стандартный код, предоставляемый базовой библиотекой. Вы получаете ссылку на ошибку, если вам не хватает материала.

1

Как насчет того, чтобы отделить создание файлов, чтобы перестроить их только при необходимости.

OBJECTS= p6.o SetIter.o Set.o Node.o 

.cpp.o: $*.cpp 
    $(CC) $(CFLAGS) -cpp $*.cpp 
p6.o: p6.cpp SetIter.cpp // any file that it depends on 
SetIter.o: SetIter.cpp Set.cpp //etc 
Set.o: Set.cpp Node.cpp 
Node.o: Node.cpp 
p6: $(OBJECTS) 
    $(CC) $(CFLAGS) $(OBJECTS) -o 
MakePg6: p6 

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

0

Если ваш Makefile работает так, как указано, тогда вы должны правильно настроить файлы заголовков (например, Node.h). Таким образом, различные файлы могут быть скомпилированы отдельно и связаны, но независимо от того, выполняете ли вы это или нет, вы должны учитывать зависимости от файлов заголовков.

OBJECTS= p6.o SetIter.o Node.o Set.o 
CFLAGS= -ansi -pendantic -Wall -Wextra 
CC= g++ 

# This will compile any object file (something.o) that is called for 
# Note that I am using automatic variables-- "$<" means the first prerequisite 
# (the .cpp file), "$^" means all the prerequisites, and "[email protected]" means the target. 
%.o: %.cpp 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

# If A.cpp (or A.h) includes B.h, then if you change B.h you must recompile A.o, 
# So A.o depends on B.h. 
# I will make some educated guesses about how you include header files: 

SetIter.o Node.o Set.o: Node.h 
Set.o: Set.h 
SetIter.o p6.o: Set.h SetIter.h 

# This will link the object files together to make pg6. 
# Notice that the target is the name of thing actually made, a good practice. 
pg6: $(OBJECTS) 
    $(CC) $(CFLAGS) $^ -o [email protected] 

Вы должны разработать эти зависимости .h, взглянув на код. Есть способы иметь g ++ и сделать это автоматически, но это расширенный метод.

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