как да напишете makefile, за да се погрижите за промените в заглавния файл

Всъщност имам библиотека "cryptopp" и това, което искам е, когато направя някаква промяна във файл и издам командата make, тя да се погрижи за промените, направени във всеки файл в изходната директория. добре, GNUMakefile на cryptoopp се грижи за промените 'if', направени в '.cpp' файловете, но не и за промените, направени в '.h' файл.

И така, какви промени мога да направя в „GNUMakefile“ на cryptopp, така че да разглежда всички модифицирани заглавни файлове и да компилира повторно всички файлове, зависещи от „модифицирания“ заглавен файл.


person A. K.    schedule 01.09.2011    source източник


Отговори (3)


Ако изграждате с g++, можете да позволите на g++ да генерира makefiles на зависимости. Можете да ги включите в основния си makefile.

Използвайте аргументите -M и -M*, за да използвате тази функция. (вижте http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Preprocessor-Options.html#Preprocessor-Options)

person Ingmar Blonk    schedule 01.09.2011

Трябва да добавите всички зависимости към вашия Makefile:

mycode.o: mycode.cpp mycode.h somelib.h resources.h
        $(CXX) -c -o $@ $< $(CXXFLAGS) $(INCLUDES)

Ако вече имате общ команден ред за съвпадение на шаблони, не е нужно да произнасяте командата отново, можете просто да изброите зависимостите:

%o: %.cpp
        $(CXX) -c -o $@ $< $(CXXFLAGS) $(INCLUDES)

mycode.o: mycode.cpp mycode.h somelib.h resources.h

yourcode.o: yourcode.cpp yourcode.h mycode.h somethingelse.h

# ...

Като цяло това е ужасна и неразширима бъркотия. Почти със сигурност ще искате система за изграждане от по-високо ниво, която да генерира Makefile вместо вас. Дори за много малки проекти поддържането на зависимостите на заглавката актуални в Makefile е такава болка, че просто не си струва.

Има няколко популярни преносими среди за изграждане. Аз лично много харесвам cmake, което включва откриване, ако сте променили настройките за компилация (да речем от Debug на Release) и винаги ще компилира всички необходими файлове (например, ако промените главния файл на cmake и напишете „make“ ще автоматично стартира отново cmake вместо вас).

За решение само за Unix можете да опитате makedepend или прословутия autotools, въпреки че това е съвсем друго главоболие...

person Kerrek SB    schedule 01.09.2011
comment
Това е бъркотия. Ето защо се използват .depend файлове (генерирани автоматично от компилатора)... - person Diego Sevilla; 02.09.2011

Може да опитате 'makedepend', ако е инсталиран на вашата система. Най-лесният начин е да добавите цел към вашия makefile. Нещо като:

depend:
    makedepend *.cc

Може да се наложи да замените „*.cc“ със списък на вашите изходни файлове. След това можете да генерирате отново всички зависимости с командата "make depend". Може да искате да пренасочите съобщенията за грешка към /dev/null, тъй като винаги изглежда, че генерира много шум.

person John Gordon    schedule 01.09.2011