PRÁCTICA BIBLIOTECAS PROGRAMACIÓN DE SISTEMAS Archivo: funciones.c #include<stdio.h> float suma(float a, float b){ return a+b; } float resta(float a, float b){ return a-b; } Archivo: libfunciones.h #ifndef _LIBFUNCIONES_H #define _LIBFUNCIONES_H extern float suma (float a, float b); extern float resta (float a, float b); #endif Archivo: principal.c #include"libfunciones.h" #include<stdio.h> float a, b; int main(){ printf("\n Introduzca un número "); scanf("%f",&a); printf("\n Introduzca otro número "); scanf("%f",&b); printf("\n la suma es %f", suma(a,b)); printf("\n la resta es %f", resta(a,b)); } 1. Con los archivos anteriores, ejecuta los pasos necesarios para crear la biblioteca estática y la biblioteca compartida (dinámica). 2. Deberás generar el archivo funciones.o, libfunciones.a, libfunciones.so y el ejecutable que haga uso de la biblioteca dinámica y otro para la biblioteca estática. Pasos para crear la biblioteca estática: 1. gcc -static -c funciones.c -o funciones.o //se crea el archivo objeto de funciones 2. ar -rsc libfunciones.a funciones.o //se crea la biblioteca con el archivo objeto funciones 3. gcc principal.c -L. -lfunciones <o puedes ejecutar el siguiente comando> gcc -o ejecutable principal.c -L. -lfunciones // se compila y se crea el ejecutable Contesta las siguientes preguntas: ¿Cuál es la utilidad de la herramienta ar? ¿Qué indican los parámetros -rsc? ¿Qué hace el parámetro -L.? ¿Qué hace el parámetro -lfunciones? ¿Por qué si mi biblioteca se llama libfunciones sólo debo escribir -lfunciones? ¿Si ejecutas el comando: objdump funciones.o -S qué sucede? ¿Qué sucede si ejecutas el comando: nm libfunciones.a, qué información arroja y para qué te puede servir? NOTA: Pueden usar el comando man <comando> para revisar el manual/ayuda del cualquier comando de Linux. BIBLIOTECAS DINÁMICAS 1. COMPILAR LA BIBLIOTECA FUNCIONES gcc -c funciones.c 2.GENERAR LA BIBLIOTECA DINÁMICA ld -o libfunciones.so funciones.o -shared 3.COMPILAR EL PROGRAMA PRINCIPAL USANDO LA BIBLIOTECA DINÁMICA (modificar el programa principal para que incluya la biblioteca dinámica, no estática) gcc -o principal principal.c -I. -L. -Bdynamic -lfunciones 4.intentar ejecutar ./principal export LD_LIBRARY_PATH=. intentar ejecutar ./principal Agregar al PATH la rutas en donde se encuentran bibliotecas dinámicas, en este caso es la actual, por defecto las busca en usr/lib NOTAS: -I indica la ruta del archivo de cabecera -L indica la ruta del archivo de funciones (la ruta actual) -Bdynamic para que busque la biblioteca .so en lugar de la .a si existen las dos: se toma por defecto .a si existe una: se toma esa si no existe ninguna: error