una que programacion make librerías librerias libreria estaticas dinámicas dinamicas dinamica diferencias desarrolladas crear creacion con comando bibliotecas c++ c makefile unix

c++ - programacion - que es makefile



Creación de un proyecto, desde Makefile a bibliotecas estáticas/dinámicas en UNIX (6)

Cuando estaba aprendiendo sobre la programación de Linux, la programación avanzada de Linux me ayudó mucho. Puede consultar la sección Cómo escribir y usar bibliotecas en este pdf . Explica bastante acerca de las bibliotecas en Linux.

Chicos, ¿podrían describir algunas cosas acerca de los bloques de construcción de c ++, en Unix?

Quiero crear una aplicación que enlace con las librerías estáticas y dinámicas (.so).

Pregunta 1: ¿Cómo creo una biblioteca estática usando gcc / g ++? ¿Cómo hago que mi aplicación se enlace con ella?

Pregunta 2: Cómo especificarlo en el makefile, vinculando con librerías estáticas y dinámicas, asumiendo que ambas bibliotecas tienen archivos de encabezado

Resumen: He estado usando makefiles y bibliotecas durante años, escritos por otra persona. Por lo tanto, cada vez que lo modificaba, simplemente cortaba y pegaba cosas alrededor, sin entenderlo realmente. Ahora quiero bajar al suelo y comprender en profundidad el proceso de creación / vinculación / creación de Makfile.

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

Gracias


Desnudo Makefile para crear una biblioteca estática que consta del 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)

Desnudos Makefile para una aplicación baz.cpp que está vinculada 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)

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


Respuesta 1: para crear una biblioteca estática a partir de los archivos de origen foo.c y bar.c, haga lo siguiente:

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 del GCC para aprender a usar el compilador y el enlazador a través del compilador. El manual de binutils también debería ser útil.

Respuesta 2: El manual de GNU Make es bastante bueno. Para aprender realmente sobre las bibliotecas y cómo funcionan, lea el libro de Linkers and Loaders de John R. Levine.

Las bibliotecas estáticas son bastante simples, pero las bibliotecas compartidas pueden ser muy complicadas, dependiendo de la plataforma y la cantidad de portabilidad que desee y necesite. Como ejemplo, en algunos sistemas, las bibliotecas estáticas y compartidas deben compilarse con diferentes opciones para que funcionen correctamente (uno debe y el otro no debe compilarse con un código independiente de la posición). Se han desarrollado marcos enteros de utilidades para hacer esto más fácil (libtool), pero ellos mismos no tienen problemas.



Ya que te refieres a gcc, asumo que estás utilizando GNU Make. La mejor documentación que he encontrado es el manual oficial , que cubre todo lo que necesita saber en términos fáciles de entender.


Las bibliotecas estáticas generalmente se archivan con el comando ar . Una vez que -fPIC todos los archivos de objetos (preferiblemente con el conmutador -fPIC en GCC), puede ejecutar ar así:

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

La página de man describe las opciones.

Las bibliotecas dinámicas se crean generalmente con el conmutador -shared a 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.

La vinculación con estas bibliotecas se puede hacer listando las bibliotecas con el -lX -l (ell) (como -lX para vincular a libX.so ) o especificándolas directamente con rutas absolutas (como agregar /usr/lib/libX.so a su orden). Las bibliotecas estáticas se vinculan especificando -static antes de -l o la ruta absoluta apropiada al archivo .a .