2009-03-01 18 views
16

Chicos, ¿describiría algunas cosas sobre C++ building blocks, en Unix.Creando un proyecto, desde Makefile a bibliotecas estáticas/dinámicas en UNIX

Quiero crear una aplicación que vincule contra libs estáticas y libs dinámicas (.so).

Pregunta 1:¿Cómo se crea la biblioteca estática usando gcc/g ++ ¿Cómo hago que mi enlace de la aplicación en contra de ella?.

Pregunta 2:¿Cómo especificarlo en el archivo MAKE, el ligado con librerías estáticas y dinámicas, suponiendo que ambas bibliotecas han archivos de cabecera

Resumen: He estado usando archivos make y bibliotecas durante años, escrito por otra persona. Por lo tanto, cada vez que lo modifiqué, simplemente corté y pegué cosas sin entenderlo realmente. Ahora quiero bajar al suelo y comprender a fondo el proceso de creación/vinculación/Creación de Makfile.

¿Qué es un buen libro que describe estos conceptos en detalles íntimos?

Gracias

Respuesta

15

bibliotecas estáticas son generalmente archivados con el comando ar. Una vez que construir todos los archivos objeto (preferiblemente con el interruptor -fPIC en GCC), puede ejecutar ar así:

ar -rs archivename.a list.o of.o objects.o 

La página man describe las opciones.

bibliotecas dinámicas se construyen generalmente con el interruptor -shared-gcc o ld y el nombre del archivo de salida con una extensión .so.

Autotools maneja esto con el programa libtool. No estoy familiarizado con su uso.

Vinculación contra estas bibliotecas se puede hacer ya sea haciendo una lista de las bibliotecas con el interruptor -l (ele) (como -lX para enlazar a libX.so) o especificando directamente con rutas absolutas (como añadir /usr/lib/libX.so a su comando). Las bibliotecas estáticas se vinculan especificando -static antes de -l o la ruta absoluta adecuada al archivo .a.

10

Bare huesos Makefile para la creación de una biblioteca estática que consiste en el código en foo.cpp, bar.cpp:

PROJECT = library.a 
OBJECTS = foo.o bar.o 
CFLAGS = -Wall -pedantic 

all: $(PROJECT) 

.cpp.o: 
     g++ -c $(CFLAGS) $< 

$(PROJECT): $(OBJECTS) 
     libtool -o $(PROJECT) -static $(OBJECTS) 

huesos Bare Makefile para un baz.cpp aplicación que enlaces estáticos a library.A:

PROJECT = baz 
CFLAGS = -Wall -pedantic 
OBJECTS = baz.o 

all: $(PROJECT) 

.cpp.o: 
     g++ -c $(CFLAGS) $< 

$(PROJECT): $(OBJECTS) library.a 
     g++ $(OBJECTS) -L. -llibrary -o $(PROJECT) 

Biblioteca dinámica dejó, ejem, como un ejercicio para el lector.

+0

¿Cuál es la bandera -c en gcc. ¿Qué pasa con el archivo de encabezado? –

+0

también, ¿significa $ <, todos los archivos cpp? ¿Por qué necesita este caso .cpp.o: g ++ -c $ (CFLAGS) $

+0

-c significa compilar pero no enlazar. $

2

Respuesta 1: Para crear una biblioteca estática a partir de los archivos fuente foo.c y la barra.c, hacer esto:

gcc -c foo.c 
gcc -c bar.c 
ar rc mylibrary.a foo.o bar.o 

Para obtener más información sobre esto, lea el manual de GCC manual a aprender a utilizar el compilador y el enlazador a través del compilador. El binutils manual también debería ser útil.

Respuesta 2: La GNU Make manual es bonita buena. Para aprender realmente sobre las bibliotecas y cómo funcionan, lea el Enlazadores y cargadores libro de John R. Levine.

Las bibliotecas estáticas son bastante simples, pero las bibliotecas compartidas pueden ser muy peludas, dependiendo de en la plataforma y la cantidad de portabilidad que desee y necesite. Como ejemplo, en , algunas bibliotecas estáticas y compartidas de sistemas deben compilarse con las diferentes opciones para que funcionen correctamente (una debe y la otra no deben compilarse con el código de posición independiente ). Se han desarrollado marcos completos de utilidades para hacer esto más fácil (libtool), , pero no son nada problemáticos.

0

Como te refieres a gcc, asumo que estás usando GNU Make. La mejor documentación que he encontrado para eso es official manual, que cubre todo lo que necesita saber en términos fáciles de entender.

0

Cuando estaba aprendiendo sobre la programación de Linux, Advanced Linux Programming me ayudó mucho. Puede consultar la sección Escritura y uso de bibliotecas en this pdf. Explica bastante sobre las bibliotecas en Linux.

+1

Es un libro muy bueno, pero prefiero algo en conjunto con los archivos make. –

Cuestiones relacionadas