You are on page 1of 18

Librerías estáticas

Denominadas también librerías-objeto, son colecciones de ficheros objeto (compilados) agrupados


en un solo fichero de extensión .lib, .a, etc. junto con uno o varios ficheros de cabecera
(generalmente .h).
Nota: una posición extrema la constituyen aquellas librerías en las que toda la funcionalidad se
ha incluido en el fichero de cabecera .h, en cuyo caso no existen los módulos compilados .lib, .a,
etc. Es el caso de la Librería Estándar de Plantillas STL ( 5.1) que está compuesta casi
exclusivamente por ficheros de cabecera.  No obstante, lo anterior representa un caso extremo
que suele ser evitado, ya que por lo general, los autores incluyen en los ficheros de cabecera la
información mínima indispensable para utilizar la librería (la interfaz), incluyendo la operatoria en
forma de ficheros compilados.  La razón no suele ser otra que proteger la propiedad intelectual
(el "know how").
Durante la construcción de la aplicación, el preprocesador incluye en los fuentes los ficheros de
cabecera. Posteriormente, durante la fase de enlazado, el linker incluye en el ejecutable los módulos
correspondientes a las funciones y clases de librería que hayan sido utilizadas en el programa, de
forma que el conjunto entra a formar parte del ejecutable. De ahí su nombre: Librerías enlazadas
estáticamente [1].
Dejando aparte consideraciones de comodidad y rapidez, el  resultado de utilizar una de tales
librerías no se diferencia en nada al que puede obtenerse escribiendo en al fuente las funciones o
clases correspondientes y compilándolas como un módulo más de nuestra aplicación.
Nota:  genralmente los compiladores disponen de herramientas específicas para la creación de
librerías estáticas. Por ejemplo, la del compilador Borland C++ es el ejecutable TLIB.EXE (
1.4.0w1); las de GNU se denominan ar y ranlib. Como tendremos ocasión de ver en los
ejemplos, también pueden crearse mediante opciones específicas en la orden de compilación.
Librerías dinámicas
Otra forma de añadir funcionalidad a un ejecutable son las denominadas librerías de enlazado
dinámico (repasar en 1.4.4 el significado de "enlazado dinámico"), generalmente conocidas como
DLLs, acrónimo de su nombre en inglés ("Dynamic Linked Library"). Estas librerías se utilizan mucho
en la programación para el SO Windows. Este Sistema contiene un gran número de tales librerías de
terminación .DLL, aunque en realidad pueden tener cualquier otra terminación .EXE, .FON, .BPI,
.DRV etc. Cualquiera que sea su terminación, de forma genérica nos referiremos a ellas como DLLs,
nombre por el que son más conocidas.
Nota:  la programación tradicional de aplicaciones Windows utilizando la API del Sistema es en
realidad una sucesión de invocación a funciones contenidas en librerías de este tipo.  En
realidad este Sistema Operativo está constituido por un conjunto de DLLs; la mayoría de los
ficheros de disco asociados con el Sistema son de este tipo, y se ha llegado a afirmar que
escribir una DLL es escribir una extensión del propio Windows
§3  Diferencias:  librería Estática "versus" Dinámica
Las diferencias más relevantes de las librerías dinámicas respecto a las estáticas son
fundamentalmente dos:
 Las librerías estáticas quedan incluidas en el ejecutable, mientras las dinámicas son ficheros
externos, con lo que el tamaño de la aplicación (nuestro ejecutable) es mayor en el primer
caso que en el segundo. Esto puede ser de capital importancia en aplicaciones muy
grandes, ya que el ejecutable debe ser cargado en memoria de una sola vez [3].
 Las librerías dinámicas son ficheros independientes que pueden ser invocados desde
cualquier ejecutable, de modo que su funcionalidad puede ser compartida por varios
ejecutables. Esto significa que solo se necesita una copia de cada fichero de librería (DLL)
en el Sistema. Esta característica constituye la razón principal de su utilización, y es también
origen de algunos inconvenientes, principalmente en sistemas como Windows en los que
existen centenares de ellas.

Como consecuencia de las diferencias citadas se derivan otras. Por ejemplo:


 Si se realizan modificaciones en los módulos de una librería estática, es necesario
recompilar todos los ejecutables que la utilizan, mientras que esto no es necesario en el
caso de una librería dinámica, siempre que su interfaz se mantenga.
 Como consecuencia de lo anterior, generalmente es más difícil la depuración y
mantenimiento de aplicaciones que utilizan librerías dinámicas que las estáticas, ya que en
el primer caso, es necesario controlar qué versiones de los ejecutables (.EXE) son
compatibles con qué versiones de las DLLs y de estas entre sí, de forma que el usuario no
utilice un versiones incompatibles de los ficheros que componen la aplicación.
 Durante la ejecución de un ejecutable, las librerías estáticas que hubiesen intervenido en su
construcción no necesitan estar presentes, en cambio las dinámicas deben estar en el
mismo directorio o en el camino de búsqueda "Path" [7].
 Las librerías estáticas solo se utilizan en la fase de construcción del ejecutable. Las
dinámicas se utilizan durante la ejecución.
 Los ejecutables que utilizan librería estáticas solo incorporan los módulos de aquellas que
necesitan para resolver sus símbolos externos.  Por contra, las librerías dinámicas deben
ser cargadas en su totalidad aunque no solo se utilice una parte de su funcionalidad (no son
divisibles).
 Las librerías estáticas, que entran a formar parte indivisible del ejecutable, son cargadas con
el proceso de carga de este.  Las librerías dinámicas no necesariamente tienen que
cargarse con la carga inicial (aunque pueden serlo). De hecho, una librería dinámica puede
ser cargada bajo demanda en el momento en que se necesita su funcionalidad, e incluso
puede ser descargada cuando no resulta necesaria.
 El mecanismo de enlazado estático depende del compilador.  El de enlazado dinámico
depende del SO, de forma que manteniendo ciertas precauciones, las DLLs construidas con
un lenguaje y un compilador pueden ser utilizadas por cualquier aplicación.
§4  Utilizar Librerías
Desde la óptica del programador C++, el manejo de librerías comprende dos aspectos totalmente
diferenciados: su utilización y quizás la construcción de alguna de ellas si nuestras aplicaciones son
medianamente grandes.
En cuanto al primer punto, es seguro que cualquier aplicación por pequeña que sea, utilice algunas
de la Librería Estándar Por ejemplo, cada vez que en su código aparece una sentencia del tipo
cout << "Hola mundo" << endl;
está utilizando una librería estática, y cada vez que en la programación de una aplicación Windows
utiliza un mensaje del tipo
MessageBox(NULL, "Hola mundo!", "Mi primer programa", MB_OK);
está usando una librería dinámica.  En cuanto a su construcción, si se dedica a esto de programar
en C++, antes o después pondrá manos a la obra. Por cierto: existen empresas de software cuya
principal actividad es precisamente fabricar y vender librerías (ya hemos indicado que el mercado de
las 3pp es todo un "mundillo" dentro de la informática).
Cualquiera que sea el caso, tanto la utilización como la construcción, son diferentes según se trate
de librerías estáticas o dinámicas. En las páginas que siguen se describen en detalle ambas
situaciones. Empezaremos por una descripción general de su funcionamiento, para continuar con la
descripción de los pasos necesarios para construirlas.  A continuación exponemos los detalles de su
utilización, incluyendo un ejemplo de construcción de un ejecutable que utiliza los recursos de una
librería.
  Inicio.

[1]   Recordemos que en C++, uno de los significados del término "estático" es algo que ha sido
resuelto en tiempo de compilación 
[3]  Existen utilidades que permiten compactar ("Squeeze") un ejecutable disminuyendo su tamaño
como fichero, lo que puede ser de utilidad a la hora de transportarlo (por redes por ejemplo). Pero
incluso en estos casos, después de cargados en memoria deben ser "expandidos" a su tamaño
normal y reacomodados en memoria según un patrón definido por el SO.
[6]  BPI; acrónimo de Borland Package Import Library. Un tipo especial de librería dinámica del
citado compilador, que utiliza enlazado estático con el ejecutable que las usa.
[7]  En el caso del compilador BC++, durante la construcción de un programa o librería, este "path"
puede ser controlado mediante el comando de compilación -L o de enlazado /L. Más tarde durante la
ejecución (runtime) el "path" depende de las variables de entorno del sistema.
En los programas para Windows caben tres opciones: poner las librerías específicas en el mismo
directorio que el ejecutable (o un subdirectorio del anterior); en nuestra opinión esto sería lo
recomendado. Otra opción es ponerlas junto con el resto de librerías del sistema (Windows\System)
o en un directorio particular cualquiera (no es aconsejable).

ARCHIVOS DE PROGRAMACION REALIZADOS DURANTE CLASE

/* ESTRUCTURAS DE REPETICIÓN

ENTRADA DE DATOS:

Realizar un programa que permita ingresar 50 nmeros enteros, y los almacene en la posicin de memoria que
llamaremos DATO,

la cual sera reescrita cada vez que se edite un valor.

PROCEDIMIENTO:

Calcular:

1. Promedio de los datos pares (Almacenar en la posicin de memoria llamada PDP)

2. Numero de datos negativos (Almacenar en la posicin de memoria llamada NDN)

3. Promedio de datos impares positivos (Almacenar en la posicin de memoria llamada PDIP)

4. Promedio de todos los datos (Almacenar en la posicin de memoria llamada PD)


SALIDA DE INFORMACION

Imprimir todos los cálculos realizados

SEGUNDO EJEMPLO:

/*Relizar un programa que permita


Entrada de datos:
Ingresar el nmero de alumnos que se desean procesar y almacenar este valor en la posicin de
memoria E.
ingresar el codigo y tres notas de 0 a 5 que seran almacenadas en 4 posiciones de memoria
llamadas COD, X, Y, Z.
Procesamiento de datos:
Calcular el promedio y almacenarlo en una posicin de memoria que llamaremos PROM.
Calcular a partir del promedio la definitiva que sera almacenada en una posicion de memoria
llamada DEF, segun los siguientes criterios:
Si el promedio es mayor a 4.5 la definitiva es igual a 5.
Si el promedio esta entre 4 y 4.5 se le suma 0.3 a la definitiva.
Si el promedio esta entre 3 y 3.9 la definitiva es el mismo promedio
De lo contrario se le resta 0.2 a la definitiva.
Calcular el promedio general del curso.
Salida de informacin:
Para cualquier caso mostrar los resultados en la pantalla, junto con la definitiva calculada.
*/
#include<iostream>
#include<iomanip>
#include<conio.h>
Using namespace System;
Using namespace std;
Void main()
{
cout<<
"\n"<<" Cuantos estudiantes tiene su curso?: ";
int E;
cin>>E;
int EN;
double SUMADEF=0;
for (EN=1; EN<=E; EN++)
{
cout<<
"\n"<<" PROCESANDO EL ESTUDIANTE NUMERO: " <<EN;
cout<<
"\n\n"<<" Digite el Codigo del estudiante";
char COD[10];
cin>>COD;
cout<< "\n\n"<<" Digite la primera nota";
double X;
cin>>X;
cout<<
"\n\n"<<" Digite la segunda nota";
double Y;
cin>>Y;
cout<<
"\n\n"<<" Digite la tercera nota";
double Z;
cin>>Z;
double PROM=(X+Y+Z)/3;
double DEF;
if(PROM>4,5)
{
DEF=5,0;
}
else
{
if(PROM>=4,0)
{
DEF=PROM+0,3;
}
else
{
if(PROM>=3,0)
{
DEF=PROM;
}
else
{
DEF=PROM-0,2;
}
}
}
cout<<
"\n"<<"El estudiante con codigo: "<<COD<<"\n"<<" Promedio: "<<PROM<<"\n"<<" Definitiva: "
<<DEF;
getch();
SUMADEF=SUMADEF+DEF;
}
double PROMG=SUMADEF/E;
cout<<
"\n\n"<<"El promedio general del curso es: "<<PROMG;
getch();
}

TERCER EJERCICIO
EJERCICIO DE TAREA:
Ingresar el código y tres notas, el promedio de las notas:
calcular el promedio de las notas, definitivas de acuerdo a=
PROMEDIO >4,5   la definitiva es 5
PROMEDIO esta entre 4 y 4,5  a la definitiva se le suman tres decimas
esta entre 3 y 3,9 la definitiva es el mismo promedio
el promedio menor que tres, entons se le restan tres decimas.
 
 
 
 
 
 
 

/*TEMA DE HOY: ESTRUCTURAS DE CONTROL (CONDICIONALES)

Operadores condicionales: >, <, >=, <=, ==, !=

Ejemplos:

Si el salario es > 1500000, entonces, la bonificacion = 20000

de lo contrario la bonificacion = 34560

ENTRADA DE DATOS:

Ingresar 2 datos enteros entre 1 y 9 por el teclado y almacenarlos en las posiciones de las memoria que
llamaremos X y Y.

PROCESAMIENTO DE DATOS:

Calcular el promedio y almacenarlo en una posicion de memoria que llamaremos PROM.

Si el promedio es mayor a 5, calcular la resta de los dos numeros y almacenarla en la posicion de memoria
RES.

Si el promedio esta entre 3 y 5 calcular la divisin de los dos nmeros y almacenarla en D

De lo contrario calcular la multiplicacion de los dos nmeros y el resultado almacenarlo en MUL.

SALIDO DE INFORMACION:

Para cualquier caso, mostrar los resultados en pantalla, junto con el promedio calculado.

*/

#include<iostrEam>

#include<iomanip>

#include<conio.h>

Using namespace System;

Using namespace std;

Void main ()

{
//ENTRADA DE DATOS

cout<<

"\n"<<"Digite 2 numeros enteros entre 1 y 9";


int X, Y;

cin>>X>>Y;

//PROCESAMIENTO DE DATOS
float PROM;

PROM= (X+Y)/2;

cout<<

"\n"<<"El promedio de los datos es:"<<PROM;

getch();

if(PROM>5)

int RES=X-Y;

cout<<

"\n"<<X<<"-"<<Y<<"="<<RES;

getch();

else

if(PROM>=3)

float D;

D=X/Y;

cout<<

"\n"<<X<<"/"<<Y<<"="<<D;

getch();
}

else

float MUL;

MUL=X*Y;

cout<<

"\n"<<X<<"*"<<Y<<"="<<MUL;

getch();

}
CUARTO EJERCICIO

/* Realizar un programa que permita:

Digitar la informacion de L listas. En cada lista hay N numeros que se deben digitar a traves del teclado.

Calcular:

El promedio de los numeros de cada lista

El promedio total de todas las listas

El mayor dato de cada lista

El menor dato de todas las listas

parametros de for: valor inicial, valor final, de cuanto en cuanto--

Imprimir los clculos realizados

*/

#include

<iostream>

#include

<iomanip>

#include

<conio.h>

using

namespace System;

using

namespace std;

void
main ()

//PRIMER PASO: Ingresar la cantidad de listas a procesar


int L;

cout<<

"\n Cuantas listas desea procesar?";

cin>>L;

//SEGUNDO PASO: Recorrer lista por lista para poder ingresar y procesar los datos
double SUMDPL=0;
double menor=99999999999999;
for(int NL=1; NL<=L; NL=NL+1)

cout<<

"\n\n\n Procesando lista "<<NL;


//TERCER PASO: Ingresar la cantidad de datos por lista.
int N;

cout<<

"\n\n Cuantos datos tiene la lista "<<NL<<" ";

cin>>N;

//CUARTO PASO: Recorrer los datos de cada lista


double SUMDL=0;
double mayor=0;
for (int ND=1; ND<=N; ND++)

//QUINTO PASO: Ingresar el dato que ser procesado


int DATO;

cout<<

"\n De la lista numero: "<<NL<<" ingrese el dato numero:"<<ND<<" ";

cin>>DATO;

if(DATO>mayor)

{
mayor=DATO;

if (DATO<menor)

menor=DATO;

SUMDL=SUMDL+DATO;

//SUMDL+=DATO

cout<<

"\n\n El promedio de los datos de la lista "<<NL<<" es: "<<(SUMDL/N);

cout<<

"\n\n El mayor dato de la lista: "<<NL<< "es "<<mayor;

SUMDPL+=(SUMDL/N);

getch();

cout<<

"\n\n\n El promedio de datos de todas las listas es: "<<(SUMDPL/L);

cout<<

"\n\n\n El menor dato de todas las listas es: "<<menor;

getch ();

}
QUINTO EJEMPLO

/*Realizar un programa que permita:

ENTRADA DE DATOS

Ingresar 3 valores enteros que corresponden a los coeficientes de la

ecuacion AX^2+BX+C=0 y almacenar estos valores en las posiciones de la memoria que llamaremos

A, B y C.

PROCESAMIENTO DE DATOS

Calcular las dos posibles soluciones de la ecuacin y el resultado almacenarlo en las posiciones de memoria

XyY

Utilizar la formula
X=(-B+RC(B^2-4AC))/(2A)

Y=(-B-RC(B^2-4AC))/(2A)

SALIDA DE INFORMACION

Imprimir la ecuacin y las soluciones.

Suponer (B^2-4ac)>0

Suponer A!=0

*/

#include<iostream>

#include<iomanip>

#include<conio.h>

#include<math.h>

using

namespace System;

using

namespace std;

void

main()

//ENTRADA DE DATOS
float A, B, C;

cout<<

"\n"<<"Por favor digite el primer coeficiente: ";

cin>>A;

cout<<

"\n"<<"Por favor digite el segundo coeficiente: ";

cin>>B;
cout<<

"\n"<<"Por favor digite el tercer coeficiente: ";

cin>>C;

//PROCESAMIENTO DE DATOS
float X, Y;

X=(-B+sqrt(pow(B,2)-4*A*C))/(2*A);

Y=(-B-sqrt(pow(B,2)-4*A*C))/(2*A);

//SALIDA DE INFORMACION

cout<<

"\n"<<A<<"X^2+"<<B<<"X +"<<C<<" = 0";

cout<<

"\n"<<" Primera solucion X1 = "<<X;

cout<<

"\n"<<" Segunda solucion X2 = "<<Y;

getch();

}
 

TAREA:

Javier Medina Cruz

Realizar un programa que permita ingresar por el teclado: la aceleracion (m/seg*seg) , la velocidad (km/hora)
de un vehiculo que realiza un MRU.

Calcular la velocidad final (m/seg) si el vehiculo gastó 3 horas en llegar a su destino final

Calcular el espacio recorrido por el vehiculo (metros)

Imprimir lo calculado

VF=VI+AT

VF^2= VI^2+2AX

SISTEMA INTERNACIONAL MKS


PRIMER PARCIAL PROGRAMACIÓN EN C
Y C++
/*Realizar un programa C++, que permita para un grupo de E empleados:

1. Ingresar nombre, salario básico y tipo de vinculo;


2. Para cada empleado Calcular el salario neto a pagar bajo las
siguientes condiciones:

a. Si salario básico es mayor a dos smmlv (dato entrada) se le hace


un descuento
del cuatro punto treinta y tres por ciento sobre el basico

b. Si está entre 1 y 2 smmlv se le hace una bonificacion


equivalente a la quinta parte del basico

c. De lo contrario, la bonificacion es del 2% y el descuento del


1.33%

3. Calcular e imprimir el total neto pagado, total de descuentos y total


de bonificaciones que hizo la empresa.

4. Imprimir el nombre del empleado que gana menos salario neto.

5. Calcular el promedio de salarios basicos de la empresa.

nota:
deben usar la libreria stirng.h
#include<string.h>
strcpy(X, Y)
*/
#include<iostream>
#include<iomanip>
#include<string.h>
#include<conio.h>
using namespace System;
using namespace std;
void main()
{
//Entrada de datos

double E, SMMLV;
cout<<"Ingrese la cantidad de empleados";
cin>>E;
cout<<"Ingrese el valor del salarío mínimo";
cin>>SMMLV;

for(int NE=1;NE<=E; NE=NE+1)


{
//ENTRADA DE DATOS
cout<<"\n\n\n Procesando empleado"<< NE;
double SAL;
char NOM[35];
char VIN[35];
cout<<"\n"<<"Porfavor digite su nombre";
cin>>NOM;
cout<<"\n Porfavor ingrese su salario básico";
cin>>SAL;
cout<<"\n"<<"Porfavor ingrese el tipo de vinculo";
cin>>VIN;
//PPROCESAMIENTO DE DATOS
if(SAL>=(2*SMMLV))
{
cout<<"\n El descuento del 4.33% del empleado
"<<NOM<<" ha sido de "<<SAL*(0.433);
cout<<"\n El salario total del empleado "<<NE<<"
es de "<<SAL-(SAL*(0.433));

}
else
{
if (SMMLV<SAL<(2*SMMLV))
{
cout<<"\n La bonificación del empleado "<<NOM<<"
ha sido de "<<(SAL*(1/5));
cout<<"\n El salario total del empleado "<<NE<<"
es de "<<SAL+(SAL*(1/5));
}
else
{
if(SAL<=SMMLV)
{
cout<<"\n LA bonificacion del empleado
"<<NOM<<" ha sido de "<<(SAL*(0.02));
cout<<"\n El descuento realizado ha sido de
"<<(SAL*(0.133));
cout<<"\n El salario total del empleado es
de "<<(SAL+(SAL*(0.02))-(SAL*(0.133)));
}
}
}

You might also like