2016-11-15 18 views
6

Szukałem tego od wielu godzin, ale jakoś nadal nie znalazłem czegoś, co działa dla mnie.Makefile: Automatycznie kompiluj wszystkie pliki c, zachowując pliki .o w oddzielnym folderze

Co mam to katalog z 3 podkatalogami. src/for .c i .h files, bin/gdzie powinien znajdować się skompilowany plik wykonywalny i obj/gdzie chcę, aby pliki .obj zostały uruchomione.

Teraz chcę makefile skompilować każdy plik .c z src (bez konieczności wymieniania ich wszystkich w pliku makefile) i umieścić pliki .o w obj i plik wykonywalny zbudowany z foo.c zapisany jako bin/foo .

Czy ktoś może mi pomóc? Ilekroć używam symboli wieloznacznych, zgłaszam narzekania, że ​​reguły nie istnieją i kiedy używam niejawnych reguł, nie umieszczam plików obiektów w oddzielnym folderze.

Odpowiedz

9

Aby zbudować foo.o z foo.c, lokalnie:

foo.o: foo.c 
    $(CC) -c $< -o [email protected] 

Aby zrobić to samo, ale z wszelkich potrzebnych plików nagłówkowych w src/:

SRC := src 

foo.o: foo.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

Aby zrobić to samo, ale z plikiem źródłowym w src/:

SRC := src 

foo.o: $(SRC)/foo.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

Aby to zrobić, ale umieścić plik wynikowy w obj/:

SRC := src 
OBJ := obj 

$(OBJ)/foo.o: $(SRC)/foo.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

Reguła wzór, który zrobi to za każdym takim pliku obiektowego (obj/foo.o, obj/bar.o, ...):

SRC := src 
OBJ := obj 

$(OBJ)/%.o: $(SRC)/%.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

Aby utworzyć listę pożądanych obiektów:

SOURCES := $(wildcard $(SRC)/*.c) 
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES)) 

a reguła pokryć je wszystkie:

all: $(OBJECTS) 

Kładzenie to wszystko razem:

SRC := src 
OBJ := obj 

SOURCES := $(wildcard $(SRC)/*.c) 
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES)) 

all: $(OBJECTS) 
    $(CC) $^ -o [email protected] 

$(OBJ)/%.o: $(SRC)/%.c 
    $(CC) -I$(SRC) -c $< -o [email protected] 

Zauważ, że ten ma jedną wielką wadę: jest nie śledzenie zależności na plikach nagłówkowych. Można to zrobić automatycznie, ale jest to subtelna sztuczka; może poczekać, aż opanujesz tak dużo.

+0

Dziękuję za fantastyczną odpowiedź. Ostatni fragment nie będzie faktycznie budował pliku wykonywalnego, ale dodanie go nie stanowiło problemu, a wszystkie pliki są tam, gdzie chcę je mieć :) – Max

+0

Ta ostatnia reguła będzie prawdopodobnie wyglądać lepiej, gdy meta statyczna będzie wyglądała normalnie. – bobbogo

+0

@bobbogo: Zgadzam się, ale starałem się o prostotę. – Beta

Powiązane problemy