2009-02-06 22 views

risposta

75

Questi sono in genere parte della riga di comando del linker e sono forniti direttamente in un'azione di destinazione o più comunemente assegnati a una variabile make che verrà espansa per formare il comando di collegamento. In tal caso:

-L è il percorso delle directory contenenti le librerie. Un percorso di ricerca per le biblioteche.

-l è il nome della libreria a cui si desidera collegare.

Per esempio, se si desidera collegare alla libreria ~/libs/libabc.a che ci si aggiunge:

-L$(HOME)/libs -labc 

Per sfruttare la regola implicita di default per il collegamento, aggiungere questi flag alla variabile LDFLAGS, come in

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

e 'una buona abitudine di separare LDFLAGS e LIBS, per esempio

# 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] 

Anche se può funzionare in caso contrario, le direttive -l... si suppone di andare dopo gli oggetti che fanno riferimento a quei simboli. Alcune ottimizzazioni (-Wl,--as-needed sono le più ovvie) non riusciranno se il collegamento viene eseguito nell'ordine sbagliato.

+0

https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html: > LDFLAGS Flag aggiuntivi da fornire ai compilatori quando devono richiamare il linker, 'ld', ad esempio -L. Le librerie (-lfoo) dovrebbero invece essere aggiunte alla variabile LDLIBS. > LDLIBS Flag di libreria o nomi dati ai compilatori quando si suppone che invochino il linker, 'ld'. LOADLIBES è un'alternativa deprecata (ma ancora supportata) a LDLIBS. I flag di linker non librerie, come -L, dovrebbero andare nella variabile LDFLAGS. –

0

Una cosa da notare è che queste sono le opzioni passate al compilatore/linker. Quindi dovresti guardare le pagine man/la documentazione del compilatore per conoscerne il ruolo.

17

Per creare un vero makefile, è necessario avere una buona conoscenza delle righe di comando per tutti i componenti della toolchain del progetto. Opzioni come -I e -L non sono comprese dal marchio stesso. Piuttosto, make sta tentando di creare una riga di comando che eseguirà uno strumento per trasformare un file prerequisito in un file di destinazione.

Spesso, questo è un file sorgente C o C++ che viene compilato in un file oggetto e infine collegato per ottenere un file eseguibile.

In tal caso, è necessario consultare il manuale del compilatore, in particolare i bit relativi alle opzioni della riga di comando che comprende.

Tutto ciò detto in termini generici, quelle opzioni specifiche sono piuttosto standard tra compilatori e linker. -I aggiunge una directory all'elenco dei luoghi cercati dal compilatore per un file denominato su una riga #include e -L aggiunge una directory all'elenco di luoghi cercati dal linker per una libreria denominata con l'opzione -l.

La linea di fondo è che il "linguaggio" di un makefile è una combinazione della sintassi del makefile per sé, la shell come noto a fare (di solito /bin/sh o qualcosa di simile), comandi di shell comuni (come ad esempio rm, cp , install, ecc.) E i comandi specifici per il compilatore e il linker (ad es.digitando gcc -v --help al prompt della shell si otterrà un elenco quasi completo (ed estremamente lungo) delle opzioni comprese da gcc come punto di partenza).

+0

Ancora non so quale sia il modo più efficace per rappresentare -I flag? -L può essere tradotto in LDFLAGS. – Edmon