2008-10-04 12 views
52

Chcę eksperymentować z optymalizacjami całego programu GCC. Aby to zrobić, muszę przekazać wszystkie pliki C naraz do frontendu kompilatora. Jednak używam plików Makefile do automatyzacji procesu tworzenia i nie jestem ekspertem jeśli chodzi o magię makefile.makefile - kompilacja wszystkich plików c na raz

Jak zmodyfikować plik Makefile, jeśli chcę skompilować (może nawet połączyć), używając tylko jednego połączenia z GCC?

Dla porównania - mój makefile wygląda następująco:

LIBS = -lkernel32 -luser32 -lgdi32 -lopengl32 
CFLAGS = -Wall 

OBJ = 64bitmath.o \ 
     monotone.o  \ 
     node_sort.o \ 
     planesweep.o \ 
     triangulate.o \ 
     prim_combine.o \ 
     welding.o  \ 
     test.o   \ 
     main.o 

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

test: $(OBJ) 
    gcc -o [email protected] $^ $(CFLAGS) $(LIBS) 

Odpowiedz

54
LIBS = -lkernel32 -luser32 -lgdi32 -lopengl32 
CFLAGS = -Wall 

# Should be equivalent to your list of C files, if you don't build selectively 
SRC=$(wildcard *.c) 

test: $(SRC) 
    gcc -o [email protected] $^ $(CFLAGS) $(LIBS) 
+0

Dlaczego powinna to być rzeczywista lista plików C zamiast symboli wieloznacznych? – nornagon

+7

@Nornagon, s/powinien być/powinien być równoważny z/ –

+10

@AlexB Speak English. Co to w ogóle znaczy? – Overv

34
SRCS=$(wildcard *.c) 

OBJS=$(SRCS:.c=.o) 

all: $(OBJS) 
+0

Nie wydaje mi się to odpowiedzią na pierwotne pytanie, ponieważ może wywołać wiele połączeń z '$ {CC}'. Powiedział, że to było zasadniczo to, czego chciałem za to, co starałem się zrobić. (Miałem konwersję, którą chciałem zrobić w grupie plików tekstowych, więc dodałem własną linię '.SUFFIXES' i taką, ale' $ (wildcard) 'i' $ (VARIABLE: .ext1 = .ext2) 'Konwersja była dokładnie tym, czego szukałem.) Jawnie nie głosuję ani w górę, ani w dół, chociaż powiedziałbym, że to zasługuje na niższy głos * na to pytanie *. – lindes

1

Trzeba wyjąć regułę sufiksu (% .o:% .c) na rzecz Wielkim Wybuchu reguła. coś takiego:

LIBS = -lkernel32 -luser32 -lgdi32 -lopengl32 
CFLAGS = -Wall 

OBJ = 64bitmath.o \ 
     monotone.o  \ 
     node_sort.o \ 
     planesweep.o \ 
     triangulate.o \ 
     prim_combine.o \ 
     welding.o  \ 
     test.o   \ 
     main.o 

SRCS = $(OBJ:%.o=%.c) 

test: $(SRCS) 
    gcc -o [email protected] $(CFLAGS) $(LIBS) $(SRCS) 

Jeśli masz zamiar eksperymentować z optymalizacją całego programu GCC, upewnij się, że masz dodać odpowiednią flagę flagami powyżej.

Podczas czytania dokumentów dla tych flag widzę również uwagi dotyczące optymalizacji czasu połączenia: ; powinieneś też to zbadać.

Powiązane problemy