2009-02-06 16 views

Antwort

75

Diese sind in der Regel Teil der Linker-Befehlszeile und werden entweder direkt in einer Zielaktion bereitgestellt oder häufiger einer make-Variablen zugewiesen, die zur Bildung eines Link-Befehls erweitert wird. In diesem Fall:

-L ist der Pfad zu den Verzeichnissen, die die Bibliotheken enthalten. Ein Suchpfad für Bibliotheken.

-l ist der Name der Bibliothek, die Sie verknüpfen möchten.

Zum Beispiel, wenn Sie ~/libs/libabc.a in die Bibliothek verknüpfen möchten würden Sie hinzufügen:

-L$(HOME)/libs -labc 

Um die Vorteile der Standard implizite Regel nehmen für die Verknüpfung, fügen Sie diese Flags an die Variable LDFLAGS, wie in

LDFLAGS+=-L$(HOME)/libs -labc 

Es ist eine gute Gewohnheit LDFLAGS und LIBS zu trennen, zum Beispiel

# LDFLAGS contains flags passed to the compiler for use during linking 
LDFLAGS = -Wl,--hash-style=both 
# LIBS contains libraries to link with 
LIBS = -L$(HOME)/libs -labc 
program: a.o b.o c.o 
     $(CC) $(LDFLAGS) $^ $(LIBS) -o [email protected] 
     # or if you really want to call ld directly, 
     # $(LD) $(LDFLAGS:-Wl,%=%) $^ $(LIBS) -o [email protected] 

Auch wenn es anders funktionieren kann, die -l... Richtlinien sollen nach die Objekte gehen, dass diese Symbole verweisen. Einige Optimierungen (-Wl,--as-needed ist die offensichtlichste) wird fehlschlagen, wenn die Verknüpfung in der falschen Reihenfolge erfolgt.

+0

https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html: > LDFLAGS Zusätzliche Flags für Compiler, wenn sie den Linker 'ld' aufrufen sollen, wie z -L. Bibliotheken (-lfoo) sollten stattdessen zur LDLIBS-Variablen hinzugefügt werden. > LDLIBS Bibliotheksflaggen oder Namen, die Compilern gegeben werden, wenn sie den Linker 'ld' aufrufen sollen. LOADLIBES ist eine veraltete (aber immer noch unterstützte) Alternative zu LDLIBS. Nicht-Bibliothek Linker Flags wie -L, sollte in der LDFLAGS-Variable gehen. –

0

Eine Sache zu beachten ist, dass dies die Optionen sind, die an den Compiler/Linker übergeben werden. Sie sollten sich also die Manpages/Dokumentation des Compilers ansehen, um ihre Rolle zu kennen.

17

Um wirklich ein Makefile zu erstellen, müssen Sie auch die Befehlszeilen für alle Komponenten der Toolchain Ihres Projekts gut verstehen. Optionen wie -I und -L sind nicht von selbst zu verstehen. Stattdessen versucht make, eine Befehlszeile zu erstellen, die ein Tool ausführt, um eine erforderliche Datei in eine Zieldatei zu transformieren.

Oft ist das eine C- oder C++ - Quelldatei, die in eine Objektdatei kompiliert und schließlich verknüpft wird, um eine ausführbare Datei zu erhalten.

In diesem Fall müssen Sie das Handbuch für Ihren Compiler und insbesondere die Bits zu den Befehlszeilenoptionen sehen, die es versteht.

Alles, was in generischen Begriffen gesagt, diese spezifischen Optionen sind ziemlich Standard unter den Compilern und Linkern. -I fügt der Liste der vom Compiler gesuchten Stellen für eine Datei mit dem Namen #include ein Verzeichnis hinzu, und -L fügt der Liste der vom Linker für eine mit der Option -l benannten Bibliothek ein Verzeichnis hinzu.

Das Endergebnis ist, dass die „Sprache“, eine Make-Datei eine Kombination aus der Syntax der Make-Datei selbst, Shell als bekannt zu machen (in der Regel /bin/sh oder etwas ähnliches), gemeinsame Shell-Befehle (wie rm, cp , install usw.) und die spezifischen Befehle für Ihren Compiler und Linker (zGeben Sie gcc -v --help an Ihrer Shell-Eingabeaufforderung ein, erhalten Sie eine nahezu vollständige (und extrem lange) Liste der Optionen, die von gcc als ein Anfangspunkt verstanden werden.

+0

Ich weiß immer noch nicht, was ist die effektivste Art zu vertreten -I Flagge? -L kann in LDFLAGS übersetzt werden. – Edmon