Cómo usar Bibliotecas

Por alguna razón, nunca puedo usar bibliotecas externas en ningún idioma. Estoy buscando instrucciones / explicaciones sobre cómo usar bibliotecas externas, y cómo funcionan. Cuando busco en línea, obtengo fragmentos que nunca parecen aplicarse a la biblioteca que descargo, pruebo y uso. Trabajo tanto en mac como en pc, y los ejemplos de C ++ están bien. Yo uso eclipse IDE con el complemento C ++. Si hay instrucciones que se aplican a todas las bibliotecas, sería genial.

Digamos que tiene una clase Unuseful definida de la siguiente manera:

Archivo Unuseful.h :

 class Unuseful { public: void printUnusefulStatement(); }; 

Archivo Unuseful.cpp :

 #include "unuseful.h" #include  void Unuseful::printUnusefulStatement() { std::cout < < "Hello world!" << std::endl; } 

Ahora, tienes otra clase que necesita imprimir afirmaciones inútiles:

 Unuseful u; u.printUnusefulStatement(); 

Esto significa que desea utilizar una biblioteca externa que contenga la implementación específica ( printUnusefulStatement ) que desea incluir en su código.

Puede usar esta biblioteca de dos maneras:

  1. Al proporcionar el código fuente al comstackdor
  2. Al proporcionar un archivo binario (que se había comstackdo previamente para su architecture), al enlazador

Caso 1: usar una biblioteca en tiempo de comstackción

Este es el caso más simple. Tiene el código fuente de la biblioteca que debe usar y simplemente tiene que comstackrlo junto con su código existente (por ejemplo, archivo main.cpp ). Normalmente, usted es el autor y el usuario de la biblioteca (una clase que realiza una tarea que necesita).

Comstackndo con este comando:

 g++ main.cpp unuseful.cpp 

le permite usar la implementación que necesita en su archivo main.cpp .

Caso 2: vincular una biblioteca

Con más frecuencia que en el caso 1 , no tiene el código fuente de la biblioteca que desea usar. Solo tiene el archivo de encabezado ( Unuseful.h , para continuar con el ejemplo) y una biblioteca estática o compartida (probablemente archivos [*] libunuseful.a y libunuseful.so , respectivamente).

La biblioteca estática es un archivo de archivos de objetos ( *.o ) que están vinculados dentro de sus ejecutables finales, las bibliotecas compartidas en su lugar se cargan dinámicamente, en tiempo de ejecución (consulte esta página para una mejor comprensión de la diferencia).

Las bibliotecas estáticas se crean simplemente archivando los archivos *.o con el progtwig ar :

 # Create the object files (only one here) g++ -c unuseful.cpp # Create the archive (insert the lib prefix) ar rcs libunuseful.a unuseful.o 

Las bibliotecas compartidas se crean con la opción g++ -shared :

 # Create the object file with Position Independent Code[**] g++ -fPIC -c unuseful.cpp # Crate the shared library (insert the lib prefix) g++ -shared -o libunuseful.so unuseful.o 

Supongamos ahora que tiene el archivo Unuseful.h y la biblioteca compartida (archivo libunuseful.so ) y tiene un archivo main.cpp que Unuseful una instancia de un objeto Unuseful y llama al método printUnusefulStatement .

Si intenta comstackr este archivo ( g++ main.cpp ) el enlazador se quejará porque no puede encontrar el símbolo printUnusefulStatement .

Es hora de usar la biblioteca:

 g++ main.cpp -L. -lunuseful 

La opción -L le dice al vinculador dónde buscar los archivos de la biblioteca y el indicador -l le dice al vinculador el nombre de las bibliotecas que se utilizarán (sin el prefijo lib ).

Ahora se crea el ejecutable ( a.out , porque no especifiqué un nombre diferente), y usted ha utilizado una biblioteca para implementar una funcionalidad que necesita ( printUnusefulStatement ).

Como la biblioteca compartida se carga en tiempo de ejecución, la ejecución del ejecutable a.out puede fallar porque el sistema no puede encontrar la biblioteca. Por lo general, esto se puede resolver configurando adecuadamente una variable de entorno que indique qué rutas utilizar para buscar bibliotecas dinámicas:

 # Set the LD_LIBRARY_PATH [*] export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. 

Hecho, ahora su ejecutable ha sido comstackdo y podrá ejecutar y cargar la biblioteca que necesita.

Conclusión

Esta es una descripción general rápida de las bibliotecas, que espero que pueda ayudarlo a comprender cómo se usan y proporcionan a los demás.

Hay muchos aspectos que deberían investigarse con más detalle, si le interesan: opciones de g++ al crear bibliotecas compartidas, opciones de ar , variables de entorno, el formato de bibliotecas compartidas, etc.

[*]: En un entorno Unix

[**]: si es compatible con la máquina de destino, emita un código independiente de la posición, adecuado para la vinculación dinámica y evite cualquier límite en el tamaño de la tabla de compensación global. Esta opción hace una diferencia en m68k, PowerPC y SPARC. El código independiente de la posición requiere soporte especial, y por lo tanto funciona solo en ciertas máquinas. [De la página de manual de g ++]

Aquí es donde comienza http://en.wikipedia.org/wiki/Library_(computing)

Básicamente, una ‘biblioteca’ es una colección de funciones comstackdas y declaraciones de clase.

En una Mac también hay “marcos” que son algo similares a las unidades de Pascal y contienen tanto las declaraciones como el código comstackdo.

En lenguajes administrados como Java o C #, hay paquetes y ensamblajes. Ambos están estrechamente relacionados con las bibliotecas.

Para usar bibliotecas en C o C ++, debe tener un archivo .lib (o un archivo .a para la mayoría de los comstackdores basados ​​en la cadena de herramientas POSIX o GCC) y los prototipos de las funciones que se comstackn en el archivo .lib. Dependiendo de su entorno de desarrollo (para Eclipse lo más probable es que esté utilizando el comstackdor GCC y la cadena de herramientas GNU con el enlazador LD), solo debe especificar los archivos de la biblioteca (.lib o .a) como la entrada al enlazador. La mayoría de las veces, la biblioteca se acompaña con archivos de encabezado que contienen las definiciones de prototipos de función.

Incluso si no sabía sobre el enlazador, lo cual es bastante extraño, las bibliotecas aún se usan en su progtwig implícitamente – std :: cout está en libstdc ++ o en la biblioteca de tiempo de ejecución de C.

Como ejemplo de una gran biblioteca y un útil conjunto de clases de C ++, es posible que desee ver Boost.

Para escribir GUI en Windows puede usar WinAPI que se describe en MSDN.

Para escribir GUI en Mac puede usar Carbon API que es algo similar a WinAPI, pero ahora está en desuso. La única forma de escribir GUI “legítima” para MacOS es usar Cocoa y Objective-C.

Para escribir GUI multiplataforma puede usar muchas bibliotecas: Qt, wxWidgets, GTK entre ellas.

El último pero no menos importante. C ++ no es el mejor lenguaje para GUI.