2009-02-06 17 views

Respuesta

75

Estos son típicamente parte de la línea de comando del enlazador, y se suministran directamente en una acción de destino o más comúnmente se asignan a una variable make que se ampliará para formar un comando de enlace. En ese caso:

-L es la ruta a los directorios que contienen las bibliotecas. Una ruta de búsqueda para bibliotecas.

-l es el nombre de la biblioteca que desea vincular.

Por ejemplo, si desea vincular a la biblioteca ~/libs/libabc.a deberá añadir:

-L$(HOME)/libs -labc 

Para tomar ventaja de la regla implícita por defecto para vincular, añadir estas banderas para la variable LDFLAGS, como en

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

es un buen hábito de separar LDFLAGS y LIBS, por ejemplo

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

Incluso si puede funcionar de otra manera, las directivas -l... se supone que ir después de los objetos que hacen referencia a esos símbolos. Algunas optimizaciones (-Wl,--as-needed es la más obvia) fallarán si el enlace se realiza en el orden incorrecto.

+0

https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html: > LDFLAGS Banderas extra para dar a los compiladores cuando se supone que invocan el vinculador, 'ld', como -L. Las bibliotecas (-lfoo) se deben agregar a la variable LDLIBS en su lugar. > LDLIBS Banderas de biblioteca o nombres dados a los compiladores cuando se supone que invocan el vinculador, 'ld'. LOADLIBES es una alternativa obsoleta (pero aún compatible) a LDLIBS. Los indicadores enlazadores que no son de biblioteca, como -L, deben ir en la variable LDFLAGS. –

0

Una cosa a tener en cuenta es que estas son las opciones que se pasan al compilador/vinculador. Por lo tanto, debe consultar las páginas/documentación del compilador para conocer su función.

17

Para asimilar realmente un makefile, también debe tener una buena comprensión de las líneas de comando para todos los componentes de la cadena de herramientas de su proyecto. Las opciones como -I y -L no son entendidas por make itself. Más bien, make intenta crear una línea de comando que ejecutará una herramienta para transformar un archivo de requisito previo en un archivo de destino.

A menudo, se trata de un archivo fuente C o C++ que se compila en un archivo de objeto y finalmente se vincula para obtener un archivo ejecutable.

En ese caso, necesita ver el manual de su compilador, y especialmente los bits relacionados con las opciones de línea de comandos que entiende.

Dicho todo en términos genéricos, esas opciones específicas son bastante estándar entre compiladores y vinculadores. -I agrega un directorio a la lista de lugares buscados por el compilador para un archivo llamado en una línea #include, y -L agrega un directorio a la lista de lugares buscados por el enlazador para una biblioteca nombrada con la opción -l.

La conclusión es que el "lenguaje" de un makefile es una combinación de la sintaxis del propio makefile, su cáscara como se conoce para hacer (por lo general /bin/sh o algo similar), los comandos de shell comunes (tales como rm, cp , install, etc.) y los comandos específicos para su compilador y vinculador (por ejemplo,escribiendo gcc -v --help en el intérprete de comandos de su shell le dará una lista casi completa (y extremadamente larga) de las opciones entendidas por gcc como un punto de partida).

+0

Todavía no sé cuál es la forma más efectiva de representar: ¿señalo? -L se puede traducir en LDFLAGS. – Edmon

Cuestiones relacionadas