SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: avis_phoenix en Miércoles 4 de Agosto de 2004, 04:43

Título: Librerías
Publicado por: avis_phoenix en Miércoles 4 de Agosto de 2004, 04:43
HOLA!! alguien sabe donde hay información un tanto cuanto detallada sobre librería en c++ (turbo c++ 3.0), lo que es, para que sirven, caracteristicas, que tiene de diferencia de la cabecera, como se hacen, vaya toodo sobre las librería de c, me sería de mcuha ayuda gracias.
Título: Re: Librerías
Publicado por: Getovich en Jueves 5 de Agosto de 2004, 16:34
hola, bueno de forma muy resumida te dare uno datos que se, hay dos tipos de librerias estan las de vinculo dinamico y las de vinculo estatico, *.dll y *.lib respectivamente, las primeras se cargan en memoria y pasan los puntos de entrada a la aplicacion (por ej la direccion de las funciones) para luego usarlas y las otras se compilan junto con la aplicacion (estan dentro del archivo *.exe), lo que logramos con las de vinculo dinamico es achicar el tamano del *.exe.

Para crear estas librerias debemos tener en cuenta el tipo por ejemplo:

para una libreria estatica, en el archivo de cabecera seria algo asi:

int Suma(int numero1, int numero2);

en el archivo de codigo:

#incude "micabecera.h"

int Suma(int numero1, int numero2)
{
         return numero1 + numero2;
}

para usarla debemos incluir tanto la cabecera como la libreria compilada y linkada a nuestra aplicacion.

#include "micabecera.h"

main()
{
      int a;
      int b;

    a=12;
    b=15;

   printf("%d",Suma(a,B));

}


para las de vinculo dinamico es un poco mas extenso, son para win32 y tendremos que conocer bien las razones de su llamada pero bueno vamos a ver las diferencias

en la cabecera seria:
/*si usamos dllimport/export nos evitamos tener que adjuntar un archivo de exportacion que en este caso seria algo asi
EXPORTS
Suma @01 donde asignamos un numero ordinal a la funcion
*/

#ifdef SUMA_NUMEROS_EXPORTS
#define SUMA_NUMEROS __declspec(dllexport)
#else
#define SUMA_NUMEROS __declspec(dllimport)
#endif

SUMA_NUMEROS int Suma(int numero1, int numero2);

en el archivo cpp seria muy diferente a la estatica ya que contamos con una funcion DllMain (win32)

#include "micabecera.h"

BOOL APIENTRY DllMain( HANDLE hmo,
                       DWORD  motivo_del_llamado,
                       LPVOID reservado
                )
{
    switch (motivo_del_llamado)
{
          case DLL_PROCESS_ATTACH:
         case DLL_THREAD_ATTACH:
           case DLL_THREAD_DETACH:
           case DLL_PROCESS_DETACH:
      break;
  }
    return TRUE;
}

//luego la funcion suma
SUMA_NUMEROS int Suma(int numero1, int numero2)
{
   return numero1 + numero2;
}

para usarla tambien se nos complica un poco, al tener que llamar a dos funciones una para cargarla (LoadLibrary) y otra para traer el puntero de la funcion (GetProcAddress).

en una aplicacion simple seria algo si:

#include <windows.h>
typedef int (CALLBACK* DLLSUMA)(int,int);// prototipo

int APIENTRY WinMain(HINSTANCE hin, HINSTANCE hpin, LPSRT com, int show)
{

HINSTANCE midll;
DLLSUMA el_puntero_a_suma;
int numero1;
int numero2:
int Resulatado;

midll = LoadLibrary("suma.dll");
if (midll != NULL)
{

el_puntero_a_suma = (DLLSUMA)GetProcAddress(midll, "Suma");

 if (!el_puntero_a_suma) //comprobamos si encontro el punto de entrada
   {
      FreeLibrary(midll);      
      return NULL;
   }

else //una vez encontrado usamos la funcion
   {

      //llamamos a la funcion
      Resultado = el_puntero_a_suma(numero1, numero2);
   }

}


bueno espero que te sirva de guia para poder crear tus propias librerias, fijate si podes conseguir algunos apuntes sobre el tema, es muy interesante y beneficioso para modular aplicaciones y reutilizar codigo.
Si se me fue algun detalle por ahi no duden en corregirme asi aprendemos todos.
salu2.
Título: Re: Librerías
Publicado por: avis_phoenix en Viernes 6 de Agosto de 2004, 05:42
ok,okok, de dll,no pregunte(pues si te fijas bien hable de turbo c++ 3.0 y en este no se usan los dlls, auqneu gracias), y de .lib ni medijiste nada, solo me habalste de cabeceras, y uan embarradita, de .lib solo mensionaste cosas, peor no em dijiste nada, ok, a ver deja veo :
en el .h pongo como quien dice la delcaración de las funciones, y en el .lib pongo la función ya descrita sin delcarar, ahora, comoconvierto mi archivito a .lib correcto?, y como lo añado para que lo jale, y cual es la ventaja de usar una librería a usar simplemente la cabecera?, se sería de mucha ayuda gracias.
Título: Re: Librerías
Publicado por: Getovich en Viernes 6 de Agosto de 2004, 17:26
he! no seas egoista, tu preguntaste de librerias yo te respondi sobre librerias, tene en cuenta que hay gente que le puede servir tanto un tema como otro englobado en el mismo titulo "Librerias", no pienses solo en tu pregunta, pero bueno, con respecto a la embarrada si tu me la puedes senalar con gusto respondere, lo que necesitas saber antes de programar es como funciona tu compilador, si lo supieses no me preguntarias "cual es la ventaja de usar una librería a usar simplemente la cabecera?" es como si yo te preguntara "cual es la ventaja de usar un disco rigido a usar simplemente el cable?", con respecto a tu deduccion "en el .h pongo como quien dice la delcaración de las funciones, y en el .lib pongo la función ya descrita sin delcarar, ahora, comoconvierto mi archivito a .lib correcto?" lo de la cabecera es correcto, pero veo que has fallado en la lectura de un simple codigo, como me vas a preguntar si pones la funcion sin declarar?, no te das cuenta que PRECISAMENTE LA CABECERA ES PARA DECLARAR LA FUNCION Y LA INCLUIS CON LA LINEA #include "micabecera.h", entonces el compilador cuando llegue a la linea numero 3 ya sabe que se declaro una funcion llamada Suma, porque antes paso por la linea 1 y leyo #include "micabecera.h" y en la linea 1 del archivo de cabecera leyo "int Suma(int,int);". yo te sugiero que antes de seguir adelante con lo que sea, leas un poco sobre la parte funcional del compilador, luego los conceptos basicos que debes saber antes de ponerte a programar una vez pulido todo eso comienzas a ver las optimizaciones de ejecucion, memoria, etc... creo que por ahora te daria algunas preguntas para que pongas en el foro "Que es un compilador?, Como funciona?, Que es una cabecera? Para que sirve? Que es una declaracion? y una asignacion? etc...
Título: Re: Librerías
Publicado por: avis_phoenix en Sábado 7 de Agosto de 2004, 03:13
Me encanta; porque jamás respondes mi pregunta, solo le das vuela al asunto, creo que necesito ser literal contigo, no me entiendes. Bueno si te entedi eso desde el principio, ok,ok, es cierto, te pregunte sobre librería en general, y me dijiste sobre librería en general, enfocandote con dlls, obviamente sabes más de dlls, que sobre librerías estaticas, y por lo que veo sabes menos que yo sobre como hacerlas en turbo c++ 3.0, cuando te preguntan algo y contestas dandole vueltas al asunto es que no sabes, mejor di eso: "no se hacer librerías en turbo c++ 3.0, mejor ve y revisa el manual",  ahora, no se te ocurre que esa es la primera idea que piensa cualquiera?, sucede que yo tengo una versión de turbo c sin manual, solo baje el programa, no los manuales, y la ayuda que viene ahi no te enseña nada, te eplica para que sirve cada sentencia y función, no te dice como trabaja particularmente el compilador con cada dato, ni te da una explicación de cada utilidad que tiene, claro que se que es un compilador, y se como trabaja en forma general cualquier compilador, lee mis anteriores discusiones y curiosamente pregunto cosas que casi nadie sabe, no creo que las pregunte por churro, o por que lei las preguntas en una revista, pero bueno, veo que es mejor ver por otro lado, gracias.
Título: Re: Librerías
Publicado por: avis_phoenix en Martes 7 de Septiembre de 2004, 05:25
HOLA!! bueno después de adnarle dando vueltas ami pobre compilador, vi la respuesta a lapregunta de como hacer las librerías(esto me cosnta solo en Turbo C++ ):

Como dijo Getovich debes ahcer una cabecera con todas las variables y la declaración de todas las funciones, y luego hacer otro archivo (la extensión la verdad la desconozco yo use otro .h) ahora ahi desclosas tooodas als funciones, y solo el incluyes el archivo cabecera, después te vas a options y eliges application, ahi te sale un cuadro y debes presionar el boton que dice Library, y ahora puedes compilar el archivo o crearlo (make) y creas el .lib y tengo entendido qeu eso es toodo

ahora el problema es uqe no se como linkearlo al archivo .cpp para utilizar esta nueva librería, especifico en TURBO C++ 3.0, espeor que alguiens epa larespuesta
Título: Re: Librerías
Publicado por: Geo en Jueves 9 de Septiembre de 2004, 02:48
Trata de borrarte lo que hasta ahora has entendido y prueba de nuevo desde el principio :P.

¿Cuál es tu pregunta? ¿Cómo crear librerías o información sobre las librerías de C/C++? Esto porque en tu primer post no lo aclaraste muy bien.

Pero como pareces estar interesado en la creación de librerías, te comento algunas cosas:
El problema es que yo no uso Turbo C/C++, sino MinGW con el IDE Dev-C++, trataré de conseguirme el TurboC para ver si puedo echarte una mano, pero aclara un poco mejor qué es lo que quieres (te repito que no entendí muy bien tu primer post).

Saludos,
José Jorge (Geo).