Przechodzę przez np. Pgm, aby utworzyć plik make.
http://mrbook.org/tutorials/make/
Mój folder eg_make_creation zawiera następujące pliki,
desktop:~/eg_make_creation$ ls
factorial.c functions.h hello hello.c main.c Makefile
Makefile
# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall
all:hello
hello:main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -o hello
main.o:main.c
$(CC) $(CFLAGS) main.c
factorial.o:factorial.c
$(CC) $(CFLAGS) factorial.c
hello.o:hello.c
$(CC) $(CFLAGS) hello.c
clean:
rm -rf *o hello
błąd:
desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.
Proszę, pomóż mi zrozumieć, jak skompilować ten program.
hello
jest aktualny. Zmieńclean
na,rm -f *.o hello
zanim zrobi coś nieoczekiwanego, a następnie uruchommake clean all
i sprawdź, czy to działa..phony: all clean
, ponieważall
iclean
nie są nazwami plików.Odpowiedzi:
Czasami błąd „Nic do zrobienia dla wszystkich” może być spowodowany spacjami przed poleceniem w regule makefile zamiast tabulacji. Upewnij się, że w regułach używasz tabulatorów zamiast spacji.
zamiast
Opis składni reguł znajdziesz w podręczniku GNU make: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax
źródło
all : src/server/mod_wsgi.la
, na co się zmieniłemall : </t> src/server/mod_wsgi.la
. Teraz pojawia się błąd:make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127
posudo make
. Jakaś pomoc?Usuń
hello
plik z folderu i spróbuj ponownie.all
Cel zależy odhello
celu.hello
Cel najpierw próbuje znaleźć odpowiedni plik w systemie plików. Jeśli go znajdzie i jest aktualny w plikach zależnych - nie ma nic do zrobienia.źródło
Kiedy podajesz tylko make, tworzy pierwszą regułę w twoim makefile, tj. "All". Określono, że „all” zależy od „hello”, które zależy od main.o, factorial.o i hello.o. Dlatego „make” próbuje sprawdzić, czy te pliki są obecne.
Jeśli są obecne, 'make' sprawdza, czy ich zależności, np. Main.o ma zależność main.c, uległy zmianie. Jeśli się zmieniły, make je odbudowuje, w przeciwnym razie pomija regułę. Podobnie, rekurencyjnie kontynuuje budowanie plików, które się zmieniły, i na końcu uruchamia najwyższe polecenie, „wszystko” w twoim przypadku, aby dać ci plik wykonywalny, w twoim przypadku „cześć”.
Jeśli ich nie ma, niech ślepo buduje wszystko zgodnie z regułą.
Wracając do twojego problemu, to nie jest błąd, ale „make” mówi, że każda zależność w twoim pliku makefile jest aktualna i nie musi nic robić!
źródło
Make zachowuje się poprawnie.
hello
już istnieje i nie jest starszy niż.c
pliki, dlatego nie ma więcej pracy do wykonania. Istnieją cztery scenariusze, w których make będzie musiał (ponownie) zbudować:.c
plików, będzie on nowszy niżhello
i będzie musiał zostać przebudowany po uruchomieniu make.hello
, będzie oczywiście musiał go odbudować-B
opcji możesz zmusić make do odbudowania wszystkiego .make -B all
make clean all
usuniehello
i będzie wymagać przebudowy. (Proponuję spojrzeć na komentarz @ Mat na tematrm -f *.o hello
źródło
Myślę, że przegapiłeś kartę w dziewiątej linii. Wiersz po all: hello musi być pustą kartą. Upewnij się, że masz pustą kartę w dziewiątej linii. Dzięki temu interpreter zrozumie, że chcesz użyć domyślnej receptury dla makefile.
źródło
To nie jest błąd; polecenie make w unixie działa w oparciu o znaczniki czasu. To znaczy, powiedzmy, że jeśli dokonałeś pewnych zmian
factorial.cpp
i kompilowałeś za pomocą,make
make pokazuje informację, że tylkocc -o factorial.cpp
polecenie jest wykonywane. Następnym razem, jeśli wykonasz to samo polecenie, tj.make
Bez wprowadzania zmian w żadnym pliku z rozszerzeniem.cpp
rozszerzeniem, kompilator powie, że plik wyjściowy jest aktualny. Kompilator podaje te informacje, dopóki nie wprowadzimy pewnych zmian w jakimkolwiekfile.cpp
.Zaletą programu
makefile
jest to, że skraca czas ponownej kompilacji, kompilując jedyne zmodyfikowane pliki i bezpośrednio używając.o
plików object ( ) niezmodyfikowanych plików.źródło
Dotarłem do tego osobliwego, trudnego do debugowania błędu inną drogą. Mój problem polegał na tym, że użyłem reguły wzorca na etapie budowania, gdy cel i zależność znajdowały się w różnych katalogach. Coś takiego:
Skonfigurowałem w ten sposób kilka zależności i próbowałem użyć dla nich jednego przepisu wzoru. Najwyraźniej pojedyncze zastąpienie „%” tutaj nie zadziała. Ustaliłem jasne zasady dla każdej zależności i znalazłem się z powrotem wśród szczeniąt i jednorożców!
Mam nadzieję, że to komuś pomoże!
źródło