Mam trzy pliki: program.c
, program.h
i headers.h
.
program.c
zawiera program.h
i headers.h
.
Muszę to skompilować w systemie Linux przy użyciu kompilatora gcc . Nie wiem, jak to zrobić. Netbeans stworzył jeden dla mnie, ale jest pusty.
Mam trzy pliki: program.c
, program.h
i headers.h
.
program.c
zawiera program.h
i headers.h
.
Muszę to skompilować w systemie Linux przy użyciu kompilatora gcc . Nie wiem, jak to zrobić. Netbeans stworzył jeden dla mnie, ale jest pusty.
Odpowiedzi:
Co ciekawe, nie wiedziałem, że make domyślnie użyje kompilatora C na podstawie reguł dotyczących plików źródłowych.
W każdym razie prostym rozwiązaniem, 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ętaj, że make wymaga tabulatora zamiast wcięcia spacji, więc pamiętaj o poprawieniu tego podczas kopiowania)
Jednak aby obsługiwać więcej plików C, musiałbyś stworzyć nowe reguły dla każdego z nich. Tak więc, aby ulepszyć:
HEADERS = program.h headers.h
OBJECTS = program.o
default: program
%.o: %.c $(HEADERS)
gcc -c $< -o $@
program: $(OBJECTS)
gcc $(OBJECTS) -o $@
clean:
-rm -f $(OBJECTS)
-rm -f program
Starałem się to maksymalnie uprościć, pomijając zmienne, takie jak $ (CC) i $ (CFLAGS), które są zwykle widoczne w plikach makefile. Jeśli chcesz się tego dowiedzieć, mam nadzieję, że dałem ci dobry początek.
Oto plik Makefile, którego lubię używać dla źródeł C. Zapraszam do korzystania:
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 $@
.PRECIOUS: $(TARGET) $(OBJECTS)
$(TARGET): $(OBJECTS)
$(CC) $(OBJECTS) -Wall $(LIBS) -o $@
clean:
-rm -f *.o
-rm -f $(TARGET)
Używa symboli wieloznacznych i funkcji patsubst narzędzia make do automatycznego dołączania plików .c i .h do bieżącego katalogu, co oznacza, że kiedy dodasz nowe pliki kodu do swojego katalogu, nie będziesz musiał aktualizować pliku Makefile. Jeśli jednak chcesz zmienić nazwę wygenerowanego pliku wykonywalnego, bibliotek lub flag kompilatora, możesz po prostu zmodyfikować zmienne.
W obu przypadkach nie używaj autoconf. Błagam Cię! :)
.PHONY: clean all default
tych celów, które mają być używane z wiersza poleceń. Ponadto Autoconf / Automake nie jest taki zły. Jasne, czują się okropnie, a przyzwyczajenie się do nich jest tak samo zabawne, jak przebijanie głowy przez ceglaną ścianę, ale działają i są dobrze rozwinięte i obejmują większość twoich baz, jeśli chodzi o przenośność, i w końcu znacznie ułatwi ci życie, gdy przyzwyczaisz się do ich okropnego projektu.
rm
: stackoverflow.com/questions/2989465/rm-rf-versus-rm-rf
Na przykład ten prosty plik Makefile powinien wystarczyć:
CC = gcc CFLAGS = -Wall all: program program: program.o program.o: program.c program.h nagłówki.h czysty: rm -f program program.o Uruchom program ./program
Zauważ, że <tab>
po wyczyszczeniu i uruchomieniu musi znajdować się w następnym wierszu, a nie spacje.
UPDATE Zastosowano poniższe komentarze
make
bez argumentów zwykle buduj tylko swoje oprogramowanie. Aby go uruchomić, użyj make run
(dostępne w tej odpowiedzi, ale niekoniecznie we wszystkich Makefile
s) lub uruchom bezpośrednio:./program
all: program
program.o: program.h headers.h
wystarczy. reszta jest domniemana
.c
plik, tylko program:
jest potrzebny. Słodko :)
system()
od stdlib.h
... Żadnych wad tego podejścia, prawda?
Makefile
i po prostu bezpośrednio wywołać gcc *.c *.h -o program
, prawdopodobnie dodając opcje takie jak -Wall -O2
itp.
Najprostszym plikiem make 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
W zależności od liczby nagłówków i nawyków programistycznych możesz chcieć zbadać gccmakedep. Ten program sprawdza twój bieżący katalog i dodaje na końcu makefile zależności nagłówkowe dla każdego pliku .c / cpp. Jest to przesada, gdy masz 2 nagłówki i jeden plik programu. Jeśli jednak masz ponad 5 małych programów testowych i edytujesz jeden z 10 nagłówków, możesz zaufać firmie make, że odbuduje dokładnie te programy, które zostały zmienione przez Twoje modyfikacje.