Mam pytanie dotyczące kompilacji i łączenia w Makefile (i być może w ogóle).Makefile, kompilowanie i łączenie
Mam plik server.c, który składa się z programu głównego, który ma funkcję main()
. server.c
zawiera rio.c. Mam moduł o nazwie rio
, który składa się z rio.c
i rio.h
. Nie ma funkcji main()
.
Mam dwa pytania, jak faktycznie napisać plik Makefile i najlepszą praktykę do robienia czegoś takiego.
Q1: Jak napisać Makefile
Mam następujący Makefile:
CC = gcc
CFLAGS = -Wall -Werror -Wmissing-prototypes
OBJS = server.o rio.o
all: $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o sysstatd
server.o: server.c
$(CC) $(CFLAGS) -c server.c
rio.o: rio.c rio.h
$(CC) $(CFLAGS) -c rio.c
clean:
rm -f *~ *.o sysstatd
Mam łącząc problemy z tym. Mówi, że mam wiele definicji wszystkich funkcji używanych w C. Nie jestem pewien jak to jest możliwe, ponieważ serwer.c jest skompilowany z flagą -c
, więc nic nie jest faktycznie połączone. Powinien wiedzieć, że niektóre funkcje istnieją, ale nie łączą się z nimi, dopóki reguła all
nie skompiluje obu plików obiektów razem i nie tworzy jednego pliku obiektowego, który ma wszystko połączone.
Na czym polega problem?
Q2: Najlepsza praktyka Ponieważ mam moduł, a następnie inny plik, który zawiera program główny, należy skompilować program główny, server.c
, jako osobny moduł, a następnie skompilować razem w all
lub skompilować serwer .c we wszystkich i dodać tam moduł rio.o? Zauważ, że to nadal powoduje ten sam problem z linkami, który mam powyżej, więc jestem pewien, że mój problem leży gdzieś indziej.
Czy używasz żadnych zewnętrznych bibliotek? – zeboidlund
Tak. Ale to wywołuje błędy w moich własnych funkcjach, mówiąc, że serwer.c je zdefiniował jako pierwszy. server.c i rio.h oba importują: stdio.h, stdlib.h, unistd.h i errno.h – darksky
Kiedy mówisz, "server.c zawiera rio.c", masz na myśli to w pliku 'server.c', masz linię typu '#include" rio.c "'? Jeśli tak, to jest to niewłaściwe podejście i prawdopodobne źródło błędu; powinieneś zamiast tego wpisać 'rio.h'. –