makefiles – alle c-Dateien auf einmal kompilieren

Lesezeit: 2 Minuten

Ich möchte mit GCC-Gesamtprogrammoptimierungen experimentieren. Dazu muss ich alle C-Dateien auf einmal an das Compiler-Frontend übergeben. Allerdings verwende ich Makefiles, um meinen Build-Prozess zu automatisieren, und ich bin kein Experte, wenn es um Makefile-Magie geht.

Wie soll ich das Makefile ändern, wenn ich mit nur einem Aufruf von GCC kompilieren (vielleicht sogar verlinken) möchte?

Als Referenz – mein Makefile sieht so aus:

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)

Benutzeravatar von Alex B
Alex B

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)

  • Warum sollte es die tatsächliche Liste der C-Dateien sein, anstatt Platzhalter?

    – Nornagon

    28. Juni 2011 um 2:00 Uhr

  • @nornagon, s/sollte/sollte gleichwertig sein mit/

    – Alex B

    28. Juni 2011 um 2:02 Uhr

  • @AlexB Sprich Englisch. Was bedeutet das überhaupt?

    – Übersicht

    13. Juli 2012 um 22:39 Uhr


  • @Overv es ist sed Syntax, d. h. „sollte sein“ durch „sollte äquivalent sein“ ersetzen

    – kirb

    19. Juli 2012 um 8:00 Uhr

  • Dieses Makefile wird unter stackoverflow.com/questions/3932895/makefile-aliases/… erklärt.

    – nichts101

    7. April 2014 um 12:33 Uhr

Benutzeravatar von Manas
Manas

SRCS=$(wildcard *.c)

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

all: $(OBJS)

  • Dies scheint mir eigentlich keine Antwort auf die ursprüngliche Frage zu sein, da es wahrscheinlich viele Anrufe dazu gibt ${CC}. Das heißt, es war im Wesentlichen das, was ich für das wollte, was ich zu tun versuchte. (Ich hatte eine Konvertierung, die ich mit einer Reihe von Textdateien durchführen wollte, also habe ich meine eigene hinzugefügt .SUFFIXES Linie und so, aber die $(wildcard) und die $(VARIABLE:.ext1=.ext2) Conversion waren genau das, wonach ich gesucht habe.) Ich habe ausdrücklich weder nach oben noch nach unten gestimmt, obwohl ich sagen würde, dass dies eine Ablehnung verdient für diese Frage.

    – Linde

    30. April 2015 um 21:26 Uhr

Sie müssen Ihre Suffix-Regel (%.o: %.c) zugunsten einer Big-Bang-Regel herausnehmen. Etwas wie das:

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)

Wenn Sie mit der Optimierung des gesamten Programms von GCC experimentieren, stellen Sie sicher, dass Sie das entsprechende Flag zu CFLAGS oben hinzufügen.

Beim Durchlesen der Dokumentation für diese Flags sehe ich auch Hinweise zur Linkzeitoptimierung; die solltest du auch untersuchen.

1414300cookie-checkmakefiles – alle c-Dateien auf einmal kompilieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy