C ++ включает и Makefiles - PullRequest
       32

C ++ включает и Makefiles

0 голосов
/ 14 февраля 2011

У меня двоякий вопрос о работе с заголовками C ++ и make-файлами. Я знаю, что у меня есть все части, я просто не знаю, как их соединить.

У меня есть следующие файлы:

main.cpp
Point.cpp
Point.h

Point.h объявляет мой простой объект Point, определение находится внутри файла Point.cpp. Затем внутри main() я хочу создать и использовать объект Point.

Нужно ли включать файл Point.h в файл Point.cpp или это то, что делает Makefile? Кроме того, файл main.cpp, который использует объект Point: нужно ли мне включать include для Point.cpp или это то, что сделано / может быть сделано в Makefile?

Что должен содержать каждый файл и как должен выглядеть мой Makefile?

// Работа с платформой Linux эксклюзивно //

Ответы [ 3 ]

6 голосов
/ 14 февраля 2011

Makefiles - это не что иное, как способ запуска определенных команд, когда определенные файлы устарели. Программа make почти ничего не знает о C ++.

Вы должны #include "Point.h" в обоих файлах main.cpp и Point.cpp. Если вы хотите убедиться, что make правильно перестраивает вашу программу при редактировании файлов, вы должны явно объявить main.o и Point.o как зависимости Point.h.

Вот довольно простой пример:

all : point_app

point_app : Point.o main.o
    $(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@

Point.o : Point.h

main.o : Point.h

У gcc / g ++ и make есть хитрости, которые позволяют автоматически генерировать эти зависимости заголовочных файлов, но прошло слишком много времени с тех пор, как я использовал их для того, чтобы дать им надлежащие советы по их использованию. Вы можете найти документацию по семейству опций gcc -M... в качестве отправной точки.

2 голосов
/ 14 февраля 2011

Makefiles ничего не делает с вашими заголовками. Вы должны включить в свой основной вручную, чтобы использовать точку.

0 голосов
/ 14 февраля 2011

Файл заголовка предоставляет определение класса, поэтому, где бы вы ни хотели использовать объекты класса, вы должны предоставить его определение (включив соответствующий файл заголовка).

Исходный файл (cpp) необязательно включать, если вам не нужна реализация класса. Это необходимо сделать для шаблонного класса, если только класс явно не создан.

Makefiles определяют правила для сборки библиотек или программ и не включают заголовочные файлы.

...