web-dev-qa-db-fra.com

makefiles - compile tous les fichiers c à la fois

Je veux expérimenter avec les optimisations de programme entier de GCC. Pour ce faire, je dois passer tous les fichiers C en même temps au frontend du compilateur. Cependant, j'utilise des makefiles pour automatiser mon processus de construction, et je ne suis pas un expert en matière de magie de makefile.

Comment dois-je modifier le makefile si je veux compiler (peut-être même un lien) en utilisant un seul appel à GCC?

Pour référence - mon makefile ressemble à ceci:

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 $@

test: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)
56
Nils Pipenbrinck
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 $@ $^ $(CFLAGS) $(LIBS)
57
Alex B
SRCS=$(wildcard *.c)

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

all: $(OBJS)
41
Manas

Vous devez supprimer votre règle de suffixe (% .o:% .c) en faveur d'une règle de big-bang. Quelque chose comme ça:

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 $@  $(CFLAGS) $(LIBS) $(SRCS)

Si vous allez expérimenter l'optimisation de l'ensemble du programme de GCC, assurez-vous d'ajouter le drapeau approprié à CFLAGS, ci-dessus.

En lisant les documents de ces indicateurs, je vois également des notes sur l'optimisation du temps de liaison; vous devriez aussi les enquêter.

1
James McPherson