makefile для ftp сервера — компилируется при изменении заголовочного файла

Я создал make-файл для своего проекта, и он выглядит так:

CC = g++
LDFLAGS = -lpthread
CFLAGS = -Wall -pedantic -Wno-long-long -O0 -ggdb
SOURCES = main.o List.o ProcessCommands.o HandleTransfers.o

all:    $(SOURCES)

%.o: %.cpp
$(CC) $< -o $@ -c $(CFLAGS) $(LDFLAGS)

compile:
$(CC) $(SOURCES) -o executable/ftp $(LDFLAGS)

run:
./executable/ftp

clean:
rm -rf *o ftp

doc:
doxygen ftpDocConf

Основная проблема заключается в том, что когда я изменяю любой заголовочный файл, который включен в один из моих исходных файлов, команда «make all» не замечает каких-либо изменений и возвращает «make: Ничто не должно быть сделано для« all ».» Я искал в Интернете и до сих пор не смог заставить его работать. У меня также есть еще одна «проблема» с make-файлом. Проект, для которого используется этот make-файл, является ftp-сервером, и когда я набираю «make run» для запуска исполняемого файла, что-то делаем с сервером и завершаем работу программы, которую возвращает make-файл «make»: * [run] Interrupt «. Есть ли способ, чтобы это сообщение не появлялось? Я думаю, оно появляется, потому что я выхожу из программы, используя ctrl + c, но есть ли способ сделать это по-другому, чтобы я не получил» ошибку «?

Заранее спасибо за любые ответы

1

Решение

Причина, по которой ваши объектные файлы не перекомпилируются при изменении заголовочных файлов, заключается в том, что вы не объявили какие-либо заголовочные файлы в качестве предпосылок объектных файлов. Вы должны сделать это явно, или иначе организовать автоматическую генерацию этой информации (обычно вашим компилятором). Ваше шаблонное правило %.o : %.cpp говорит, что если .cpp изменения файла, связанные .o файл должен быть восстановлен. Вы должны добавить некоторые xxx.o : xxx.h ... правила, чтобы make знал и о заголовочных файлах. Или, как я уже говорил, организуйте их автоматическое создание. Есть много решений для этого, например: GNU make: генерация автоматических зависимостей с помощью сгенерированных заголовочных файлов

На ваш второй вопрос, нет способа сделать это. Когда вы нажимаете ^C на вашем терминале он посылает сигнал прерывания не только программе ftp, но и make сам. Там нет никакого способа убедить сделать, чтобы игнорировать тот сигнал, который я знаю. Единственный способ сделать это — написать обертку вокруг make, которая изменила ID группы процессов, чтобы она не получала эти сигналы … но тогда я не знаю, как программа ftp снова присоединится к группе процессов.

Я рекомендую вам найти менее разрушительный способ выхода из программы, если это серьезная проблема. Возможно, вы могли бы отправить SIGHUP или SIGTERM процессу напрямую, используя kill или похожие.

Затем, если вы хотите, чтобы make игнорировал ошибку, измените ваше правило на что-то вроде этого:

run:
./executable/ftp || true
1

Другие решения

MadScientist хорошо объясняет вашу проблему с заголовками. Я могу добавить эти дешевые и грязные исправления:

# header files added as dependencies of .o files below
%.o: %.cpp header1.h header2.h header3.h
$(CC) $< -o $@ -c $(CFLAGS) $(LDFLAGS)

Обойти ваш make run проблема, вы можете изменить цель запуска для выполнения в xterm — таким образом xterm ловит сигнал, а не делает:

run:
xterm -e ./executable/ftp
1

По вопросам рекламы [email protected]