2017-02-22 4 views
-1

Ich schreibe ein einfaches Makefile-Projekt.So verknüpfen Sie Objekte aus verschiedenen Verzeichnissen (running ld)

Ich versuche, das Programm in zwei Schritten aufzubauen:

  1. Kompilierung Quelldateien und Objektdateien in einem anderen Verzeichnis
  2. Link die Objekte in eine ausführbare

etwas sparen betrachten einfach wie:

all: 
    gcc -o ~/some_dir/main.o -c main.c 
    ld -o my_program main.o 

das Problem ist der Aufruf directo ry ist nicht "~/some_dir" so ld findet die Objektdatei nicht ... wie kann ich "some_dir" in den ld Suchpfad aufnehmen?

In der globaleren Perspektive habe ich Objektdateien in verschiedenen Verzeichnissen und ich möchte sie alle zusammen mit einer einzigen Linker-Befehlsdatei verknüpfen.

Danke.

+0

Um, indem Sie einen verwendbaren Pfad zu dem zu verknüpfenden Objekt angeben? Wie * sonst * würdest du es tun? Aber in jedem Fall ist es am besten, 'gcc' als Linker-Treiber zu verwenden, anstatt den Linker direkt aufzurufen:' gcc -o my_program ~/some_dir/main.o'. –

+0

Anstatt Pfade zu verwenden, die mit dem Home-Verzeichnis des aktuellen Benutzers ('~/some_dir') verknüpft sind, wäre es viel sinnvoller, Builddateien relativ zum Arbeitsverzeichnis für den Build anzulegen und Quelldateien relativ zum Verzeichnis zu suchen das Makefile enthält. –

Antwort

0

Sie machen Dinge viel komplizierter als sie sein müssen und sollten make mehr von der Arbeit für Sie erledigen lassen. Im Folgenden wird Ihr einfaches Beispiel

neu geschrieben
SRCS=main.c 
BUILDDIR=~/somedir 
OBJS=$(SRCS:%.c=$(BUILDDIR)/%.o) 
CFLAGS=-g 

all: my_program 

my_program: $(OBJS) 
     $(CC) $(CFLAGS) -o [email protected] $^ 

$(BUILDDIR)/%.o: %.c 
     $(CC) $(CFLAGS) -c -o [email protected] $^ 

Es definiert eine Reihe von Variablen an der Spitze, wie SRCS, die eine Liste der Quelldateien enthalten würden, das Verzeichnis, in dem Sie die Objektdateien sind Speicher und erzeugen eine Liste der Objektdateien, die Sie erstellen werden. Dann verwendet es $(OBJS), um zu definieren, dass sie Abhängigkeiten von my_program sind. Das $ @ in der make-Regel ist eine Variable, die "die Sache, die wir bauen" bedeutet und $^ist die Liste der Abhängigkeiten. Sie können andere Abhängigkeiten zu my_program hinzufügen und müssen den Befehl, der ausgeführt wird, nicht ändern.

Dann gibt es eine Regel, die definiert, wie Objektdateien in $(BUILDDIR) aus Quelldateien im aktuellen Verzeichnis erstellt werden.

Verwandte Themen