Plik makefile - wyjaśnienie

0

Witam.
Mógłby mi ktoś wytłumaczyć tworzenie pliku makefile na podanym przykładzie?

objects = main.o emiter.o symbol.o lexer.o parser.o

comp : $(objects)
	g++ -o comp $(objects)

$(objects) : global.h parser.h

main.o : main.cpp
	g++ -c -std=c++11 main.cpp

emiter.o : emiter.cpp
	g++ -c -std=c++11 emiter.cpp

symbol.o : symbol.cpp
	g++ -c -std=c++11 symbol.cpp

lexer.o : lexer.cpp
	g++ -c -std=c++11 lexer.cpp

lexer.cpp: lexer.l
	flex -o lexer.cpp lexer.l

parser.o : parser.cpp
	g++ -c -std=c++11 parser.cpp

parser.cpp parser.h : parser.y
	bison --defines=parser.h -o parser.cpp parser.y

clean :
	rm comp $(objects)
	rm lexer.cpp

objects - jest to lista wszystkich plików wynikowych?
opcja -c oznacza ze tworzymy pliki wynikowe?
clean - czyści pliki niepotrzebne pliki tymczasowe i wynikowe?
Co oznacza ten fragment kodu?

comp : $(objects)
	g++ -o comp $(objects)

I za co odpowiada znak dolara?

0

objects - jest to lista wszystkich plików wynikowych?

Tak

opcja -c oznacza ze tworzymy pliki wynikowe?

Zamiast tworzyć plik wykonywalny, kompilator tworzy plik obiektowy (ten z końcówką .o)

clean - czyści pliki niepotrzebne pliki tymczasowe i wynikowe?

clean :
rm comp $(objects)
rm lexer.cpp

kasujemy nasze pliki .o, plik wykonywalny "comp" oraz plik lexer.cpp. Niestety make najczęściej pisany jest tak, że wszystkie pliki pośrednie itp. umieszcza w tym samym katalogu co pliki źródłowe, zamiast w oddzielnym.

comp : $(objects)
g++ -o comp $(objects)

Dosłownie oznacza to: żeby wyprodukować "comp", potrzebne są pliki z listy objects (znak $ oznacza że pobieramy wartość zmiennej, powrót do lat 80 i basha). Jak te warunki są spełnione, to wykonaj polecenie , czyli niech g++ zlinkuje pliki .o w plik wykonywalny "comp"

0

A jak uruchomić takiego makefile?

1

W katalogu projektu wpisz (w terminalu)

make

Żeby odpalić clean:

make clean

Co do tworzenia makefile - jeżeli nie musisz, to nie korzystaj z makefile, tylko z nowocześniejszych alternatyw. Zazwyczaj stosuje się CMake + ninja (choć składnia CMake też jest paskudna), do projektów prywatnych sugeruję Meson lub jak bardzo lubisz dłubać ręcznie wszystko to tup.

0
no rule to make target 'main.c' needed by 'main.o'

A co jeśli mam taki komunikat przy próbie odpalenia makefile?

2

To znaczy, że uruchamiasz inny makefile niż ten o którym mowa w tym wątku. Nie widzę tutaj nigdzie main.c.

0

W tym przypadku mam taki sam komunikat tylko main.cpp , bo jeszcze sprawdzałem na innym przykładzie

0
cc    -c -o main.o main.c
process_begin: CreateProcess(NULL, cc -c -o main.o main.c, ...) failed.
make (e=2): The system cannot find the file specified.
make: *** [main.o] Error 2

Wziałem jakis projekt makefile z internetu dodałem do folderu global.h i main i taki błąd mi wyskoczył

1

Przy takim zapisie:

main.o : main.cpp
    g++ -c -std=c++11 main.cpp

dla main.cpp make wykona dwie czynności, nie pamiętam w jakiej kolejności ale to bez znaczenia. Sprawdzi czy istnieje target w Makefile, czyli będzie będzie szukał czegoś takiego:

main.cpp:

Jeśli nie znajdzie to sprawdzi czy main.cpp nie jest plikiem. Jeżeli jest plikiem to target main.o powienien "pójść dalej". Czyli wychodzi, że make nie widzi Twojego pliku main.cpp, powinienen on być w tym samym folderze co Makefile.

(edit)
Uruchomienie tego innego Makefile zdaje się to potwierdzać.

0

Dziwne wszystko jest w tym samym folderze

1 użytkowników online, w tym zalogowanych: 0, gości: 1