Проблема создания make-файла - PullRequest
2 голосов
/ 13 апреля 2010

У меня проблемы с созданием 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 - получает набор и использует указатель на итератор через

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

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

Ответы [ 3 ]

1 голос
/ 13 апреля 2010

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

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, и я думаю, что это то, что вы пытаетесь выполнить.

1 голос
/ 13 апреля 2010

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

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

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

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

0 голосов
/ 13 апреля 2010

Если ваш 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 "$@" means the target.
%.o: %.cpp
    $(CC) $(CFLAGS) -c $< -o $@

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...