2012-07-05 35 views
22

Tengo el siguiente makefileCómo incluir biblioteca estática en el Makefile

CXXFILES = pthreads.cpp 

CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine 
LIBS = -lpthread -ldl 

all: 
    $(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS) 

clean: 
    rm -f prog *.o 

Estoy tratando de incluir la biblioteca ./libmine dentro CXXFLAGS, pero parece que no es el camino correcto para incluir una biblioteca estática, porque cuando compilo el programa, recibo muchos errores de referencias no definidas. Entonces, ¿cuál es realmente la forma correcta de incluir una biblioteca estática en el archivo MAKE?

Respuesta

13
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine 
LIBS = libmine.a -lpthread 
+2

¿Podría explicarnos un poco cómo funciona esto? – Tony

+4

OP agregó '-L./Libmine' en la compilación' gcc' y la línea de enlace, pero no añadió 'libmine.a'. '-L./Libmine' le dice a' gcc' que busque en el directorio './Libmine' para buscar los archivos y las bibliotecas de los objetos. Al agregar 'libmine.a' le dice a' gcc' que desea vincular su ejecutable con la biblioteca 'libmine.a'. – ouah

+0

LIBS = libmine.a no funciona con -L./libmine. – fchen

8

El -L simplemente muestra la ruta donde encontrar el archivo .a o .so. Lo que está buscando es agregar -lmine a la variable LIBS.

Haga que -static -lmine forzarlo a elegir la biblioteca estática (en caso de que exista una biblioteca estática y dinámica).

+0

He leído sobre el indicador '-estático', pero me preocupa que' -static' haga que todas las bibliotecas referenciadas estén estáticas, cuando solo quiero que una sea. Will '-static' solo marca la referencia anterior como estática? – Blake

+1

@ Cokemonkey11: cualquier biblioteca después del '-estático' debería preferir la versión estática de la biblioteca, sí. – 0xC0000022L

+0

@ 0xC00000022L entonces si hago '-static -lfoo -bar', tanto foo como la barra serán estáticos? Solo quiero que Foo sea estático, eso es lo que estaba tratando de preguntar. Editar: Deseo que solo foo sea * explícitamente * estático, mientras que quiero que la barra tenga un comportamiento de enlace estándar. – Blake

34

uso

LDFLAGS= -L<Directory where the library resides> -l<library name> 

igual:

LDFLAGS = -L. -lmine 

para asegurar la compilación estática también se puede añadir

LDFLAGS = -static 

O simplemente puede deshacerse de toda la búsqueda en bibliotecas, y el enlace con ella directamente

decir que tiene main.c fun.c

y una biblioteca estática libmine.a

a continuación, sólo puede hacer en su línea de enlace final del Makefile

$(CC) $(CFLAGS) main.o fun.o libmine.a 
11

Asegúrese de que la opción -L aparece antes que la opción -l; el orden de las opciones en las líneas de comando del enlazador hace materia, especialmente con bibliotecas estáticas. La opción -L especifica un directorio para buscar bibliotecas (estáticas o compartidas). La opción -lname especifica una biblioteca que está con libmine.a (estática) o libmine.so (compartida en la mayoría de las variantes de Unix, pero Mac OS X usa .dylib y HP-UX utilizada para usar .sl). Convencionalmente, una biblioteca estática estará en un archivo libmine.a. Esto es convencional, no obligatorio, pero si el nombre no está en el formato libmine.a, no puede usar la notación -lmine para encontrarlo; debe listarlo explícitamente en la línea de comando del compilador (vinculador).

La opción -L./libmine dice "hay un subdirectorio llamado libmine que se puede buscar para buscar bibliotecas". Veo tres posibilidades:

  1. Usted tiene un subdirectorio que contiene tales libmine.a, en cuyo caso también hay que añadir -lmine a la línea de enlace (después de que los archivos de objetos que hacen referencia a la biblioteca).
  2. Tiene un archivo libmine que es un archivo estático, en cuyo caso simplemente lo lista como un archivo ./libmine sin -L en frente.
  3. Tiene un archivo libmine.a en el directorio actual que desea recoger. Puede escribir ./libmine.a o -L . -lmine y ambos deben encontrar la biblioteca.
Cuestiones relacionadas