2009-09-27 14 views

Odpowiedz

145

Interesujące, nie wiedziałem, że make domyślnie byłoby używać kompilatora C podanych zasad dotyczących plików źródłowych.

W każdym razie, to proste rozwiązanie, które demonstruje proste koncepcje Makefile byłoby:

HEADERS = program.h headers.h 

default: program 

program.o: program.c $(HEADERS) 
    gcc -c program.c -o program.o 

program: program.o 
    gcc program.o -o program 

clean: 
    -rm -f program.o 
    -rm -f program 

(pamiętać, że dokonania wymaga kartę zamiast przestrzeni wcięcia, należy więc ustalić, że przy kopiowaniu)

Jednak w celu obsługi większej liczby plików C konieczne jest wprowadzenie nowych reguł dla każdego z nich. Dlatego, aby poprawić:

HEADERS = program.h headers.h 
OBJECTS = program.o 

default: program 

%.o: %.c $(HEADERS) 
    gcc -c $< -o [email protected] 

program: $(OBJECTS) 
    gcc $(OBJECTS) -o [email protected] 

clean: 
    -rm -f $(OBJECTS) 
    -rm -f program 

starałem się zrobić to tak proste, jak to możliwe, pomijając zmienne jak $ (CC) i $ (CFLAGS), które są zazwyczaj postrzegane w makefile. Jeśli chcesz się z tym pogodzić, mam nadzieję, że dałem ci dobry początek.

Oto plik Makefile, który lubię używać dla źródła C. Czuć się swobodnie z niego korzystać:

TARGET = prog 
LIBS = -lm 
CC = gcc 
CFLAGS = -g -Wall 

.PHONY: default all clean 

default: $(TARGET) 
all: default 

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c)) 
HEADERS = $(wildcard *.h) 

%.o: %.c $(HEADERS) 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

.PRECIOUS: $(TARGET) $(OBJECTS) 

$(TARGET): $(OBJECTS) 
    $(CC) $(OBJECTS) -Wall $(LIBS) -o [email protected] 

clean: 
    -rm -f *.o 
    -rm -f $(TARGET) 

Wykorzystuje funkcje wieloznacznych i patsubst na użyteczność make automatycznie obejmują .c oraz pliki .h w bieżącym katalogu, czyli po dodaniu nowych plików kodu do katalogu, nie będzie musiał aktualizować pliku Makefile. Jeśli jednak chcesz zmienić nazwę wygenerowanych plików wykonywalnych, bibliotek lub flag kompilatora, możesz po prostu zmodyfikować zmienne.

W obu przypadkach nie należy używać autoconf, proszę. Błagam Cię! :)

+6

Aby być technicznie poprawnym, uważam, że powinieneś użyć '.PHONY: clean all default' dla tych celów, które mają być użyte z linii poleceń. Również Autoconf/Automake nie są takie złe. Jasne, czują się okropnie, a przyzwyczajenie się do nich jest równie przyjemne, jak przepychanie głowy przez ceglaną ścianę, ale one działają, i są dobrze rozwinięte, i pokryją większość twoich baz, jeśli chodzi o przenośność, i sprawi, że twoje życie będzie o wiele łatwiejsze w końcu, gdy przyzwyczaisz się do ich okropnego projektu. –

+0

Myślę, że to działa, ale pomyślałem, że jeśli wpiszesz "make" na terminalu, program powinien działać. Oto, co otrzymuję: gcc statsh.o-Wall -lm -o prog Czy można po prostu wpisać make i wykonać program? – user69514

+0

gdzie można dodać flagę openmp -fopenmp – MySchizoBuddy

22

Na przykład ta prosta Makefile powinno wystarczyć:

 
CC=gcc 
CFLAGS=-Wall 

all: program 
program: program.o 
program.o: program.c program.h headers.h 

clean: 
    rm -f program program.o 
run: program 
    ./program 

Uwaga musi być <tab> na następnej linii po czyste i biegać, nie obowiązuje. poniżej

UPDATE Komentarze stosowane

+0

@ user69514: 'make' bez argumentów zazwyczaj tylko * budowa * oprogramowanie. Aby go uruchomić, użyj 'make run' (dostępnego w tej odpowiedzi, ale niekoniecznie we wszystkich' Makefile's), lub uruchom go bezpośrednio: './Program' – MestreLion

-9
gcc program.c -o program 

nie makefile konieczne.

+25

Raczej nieosiągalny, jeśli twój program staje się większy, nie rób tego. myślisz? –

10

wystarczy. reszta jest domyślna

+0

A jeśli cały twój program jest pojedynczym plikiem '.c', konieczny jest tylko' program: '. Sweet :) – MestreLion

0

W zależności od liczby nagłówków i nawyków programistycznych warto zbadać gccmakedep. Ten program sprawdza aktualny katalog i dodaje do końca pliku Makefile zależności nagłówków dla każdego pliku .c/cpp. To jest przesada, gdy masz 2 nagłówki i jeden plik programu. Jeśli jednak masz 5 lub więcej programów testowych i edytujesz jeden z 10 nagłówków, możesz zaufać, aby odbudować dokładnie te programy, które zostały zmienione przez twoje modyfikacje.

7

Najprościej zrobić plik może być

all : test 

test : test.o 
     gcc -o test test.o 

test.o : test.c 
     gcc -c test.c 

clean : 
     rm test *.o 
+0

możesz dodać więcej szczegółów, aby wyjaśnić, co Makefile robi – Federico

+1

można rzeczywiście pójść o wiele łatwiej. patrz @anonymous 1 liner –

Powiązane problemy