[C con Clase] parametro -l

Steven Davidson srd4121 en njit.edu
Vie Abr 9 19:20:00 CEST 2010


Hola Hallowin,

halowin wrote:
> 
> Gracias por contestar pero creo que sigo sin entenderlo. Vamos a ver:
> 
> Está claro que la libreria contiene el codigo binario.
> 
> Si yo quiero usar un "printf" he de poner un 
> #include <stdio>
> si no no funciona, pero si quiero usar un seno o coseno he de linkar
> con -lm; entoces deduzco que en stdio.h aparte de la definición de
> printf hay algo mas y en segundo lugar, por que no puedo poner un
> #include <math.h>
> para usar el seno y coseno por la misma regla de tres y he de poner
> el -lm.
> 

Veamos. Si quieres usar 'printf()', debes #incluir <stdio.h>, en C, o 
<cstdio>, en C++. Esto no significa que no exista una biblioteca con la 
definición de 'printf()'. Lo que pasa es que al tratarse de una función 
estándar, la biblioteca estándar implícitamente es enlazado por el 
enlazador.

En el caso, de las funciones 'sin()' y 'cos()', debes #incluir <math.h> 
(o <cmath>, en C++). Ahora bien, aunque estas funciones sean estándares, 
varios compiladores apartaron estas funciones matemáticas de las demás, 
creando dos bibliotecas. La biblioteca matemática no es enlazado 
implícitamente, y por eso debemos ser explícitos para esos compiladores.

Nada de esto cambia el mecanismo que usa el compilador y enlazador. Si 
quieres usar una función contenida en una biblioteca debes tener un 
fichero de cabecera para el compilador de C++ y otro fichero de la 
biblioteca (".a", ".lib") o incluso el fichero objeto (".o", ".obj") 
para el enlazador.

Por ejemplo, si queremos usar las funciones 'CargarBMP()' y 
'MostrarBMP()' en nuestro programa, no podemos hacer esto:

// prog.cpp

#include <cstdlib>

int main()
{
   Imagen alfombra = CargarBMP( "alfombra.bmp" );
   MostrarBMP( alfombra );

   std::system( "pause" );
   return 0;
}

El compilador se quejará porque no sabe qué es 'Imagen', ni 
'CargarBMP()', ni 'MostrarBMP()'. No tiene las declaraciones de estas 
entidades. No sabe si 'CargarBMP' es una tipo o una función, ni tampoco 
sabe cuántos parámetros requiere, ni sus tipos, ni el tipo de retorno.

Por ello, necesita un fichero de cabecera. Por ejemplo,

// bmp.h

struct Imagen
{
   unsigned long int altura;
   unsigned long int anchura;
   unsigned long int profundidad;
   unsigned char *paleta;
   unsigned char *pixeles;
};

Imagen CargarBMP( const char * );
void MostrarBMP( Imagen );


// prog.cpp

#include <cstdlib>
#include "bmp.h"

int main()
{
   Imagen alfombra = CargarBMP( "alfombra.bmp" );
   MostrarBMP( alfombra );

   std::system( "pause" );
   return 0;
}

Ahora el compilador sabe perfectamente qué son las entidades que usas y 
cómo se usan sintáctica y correctamente.

Obviamente, necesitamos las implementaciones de las funciones, pero el 
compilador no las requiere; el enlazador sí. Al enlazar, necesitamos la 
biblioteca o fichero objeto que contenga las definiciones de estas 
funciones.


Espero haber aclarado la duda.

Steven





Más información sobre la lista de distribución Cconclase