90 votes

Comment utiliser les bibliothèques

Pour une raison quelconque, je ne suis jamais en mesure d'utiliser des bibliothèques externes dans n'importe quelle langue. Je cherche des instructions/explications sur la façon d'utiliser les bibliothèques externes, ainsi que sur leur fonctionnement. Lorsque je fais des recherches en ligne, j'obtiens des fragments qui ne semblent jamais s'appliquer à la bibliothèque que je télécharge et que j'essaie d'utiliser. Je travaille à la fois sur un mac et un pc, et les exemples C++ sont parfaits. J'utilise l'IDE Eclipse avec le plug-in C++. S'il existe des instructions qui s'appliquent à toutes les bibliothèques, ce serait formidable.

203voto

Vincenzo Pii Points 4137

Disons que vous avez une classe Unuseful définis comme suit :

Fichier Unuseful.h :

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

Fichier Unuseful.cpp :

#include "unuseful.h"
#include <iostream>

void Unuseful::printUnusefulStatement()
{
    std::cout << "Hello world!" << std::endl;
}

Maintenant, vous avez une autre classe qui a besoin d'imprimer des déclarations inutiles :

Unuseful u;
u.printUnusefulStatement();

Cela signifie que vous voulez utiliser une bibliothèque externe contenant l'implémentation spécifique ( printUnusefulStatement ) que vous souhaitez inclure dans votre code.

Vous pouvez utiliser cette bibliothèque de deux manières :

  1. En fournissant le code source au compilateur
  2. En fournissant un fichier binaire (qui a été préalablement compilé pour votre architecture), à l'éditeur de lien

Cas 1 : utiliser une bibliothèque au moment de la compilation

C'est le cas le plus simple. Vous avez le code source de la bibliothèque que vous devez utiliser et vous devez simplement la compiler avec votre code existant (disons main.cpp ). En général, vous êtes l'auteur et l'utilisateur de la bibliothèque (une classe qui accomplit une tâche dont vous avez besoin).

Compilation avec cette commande :

g++ main.cpp unuseful.cpp

vous permet d'utiliser l'implémentation dont vous avez besoin dans votre main.cpp archivo.

Cas 2 : liaison d'une bibliothèque

Plus souvent que Cas 1 vous n'avez pas le code source de la bibliothèque que vous voulez utiliser. Vous n'avez que le fichier d'en-tête ( Unuseful.h pour continuer avec l'exemple) et un statique o partagé bibliothèque (probablement [*] libunuseful.a y libunuseful.so respectivement).

La bibliothèque statique est une archive de fichiers objets ( *.o ) qui sont liées à l'intérieur de vos exécutables finaux, les bibliothèques partagées sont plutôt chargées dynamiquement - au moment de l'exécution (voir cette page pour mieux comprendre la différence).

Les bibliothèques statiques sont créées en archivant simplement le fichier *.o avec les fichiers ar programme :

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

Les bibliothèques partagées sont créées avec l'option g++ -shared option :

# 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

Supposons maintenant que vous avez le Unuseful.h et la bibliothèque partagée ( libunuseful.so ) et vous avez un main.cpp qui instancie un fichier Unuseful et appelle l'objet printUnusefulStatement méthode.

Si vous essayez de compiler ce fichier ( g++ main.cpp ), l'éditeur de liens se plaindra car il ne peut pas trouver le fichier printUnusefulStatement symbole.

Il est temps d'utiliser la bibliothèque :

g++ main.cpp -L. -lunuseful

En -L indique à l'éditeur de liens où rechercher les fichiers de bibliothèque et l'option -l indique à l'éditeur de liens le nom des bibliothèques à utiliser (sans l'attribut lib préfixe).

Maintenant, l'exécutable ( a.out car je n'ai pas spécifié de nom différent) est créé, et vous avez utilisé une bibliothèque pour implémenter une fonctionnalité dont vous aviez besoin ( printUnusefulStatement ).

Puisque la bibliothèque partagée est chargée au moment de l'exécution, l'exécution de la commande a.out peut échouer parce que le système n'est pas en mesure de trouver la bibliothèque. En général, ce problème peut être résolu en définissant de manière appropriée une variable d'environnement indiquant les chemins à utiliser pour rechercher les bibliothèques dynamiques :

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

C'est fait, maintenant votre exécutable a été compilé et il sera capable de fonctionner et de charger la bibliothèque dont il a besoin.

Conclusion

Voici un rapide aperçu des bibliothèques qui, je l'espère, vous aidera à comprendre comment elles sont utilisées et mises à la disposition des autres.

Il existe de nombreux aspects qui devraient être étudiés plus en détail, si cela vous intéresse : g++ lors de la création de bibliothèques partagées, ar les options, les variables d'environnement, le format des bibliothèques partagées et ainsi de suite.

[*] : Dans un environnement Unix

[**] : Si cette option est prise en charge par la machine cible, émettre un code indépendant de la position, adapté à la liaison dynamique et évitant toute limite sur la taille de la table d'offset globale. Cette option fait une différence sur m68k, PowerPC et SPARC. Le code indépendant de la position nécessite un support spécial, et ne fonctionne donc que sur certaines machines. <em>[De la page de manuel g++]</em>

6voto

Viktor Latypov Points 9600

C'est ici que vous commencez http://en.wikipedia.org/wiki/Library_(informatique)

Fondamentalement, une "bibliothèque" est une collection de fonctions compilées et de déclarations de classes.

Sur un Mac, il existe également des "frameworks" qui ressemblent un peu aux unités de Pascal et contiennent à la fois les déclarations et le code compilé.

Dans les langages gérés comme Java ou C#, il existe des paquets et des assemblages. Tous deux sont étroitement liés aux bibliothèques.

Pour utiliser des bibliothèques en C ou C++, vous devez disposer d'un fichier .lib (ou .a pour la plupart des compilateurs basés sur la chaîne d'outils POSIX ou GCC) et des prototypes des fonctions qui sont compilées dans le fichier .lib. En fonction de votre environnement de développement (pour Eclipse, vous utilisez probablement le compilateur GCC et la chaîne d'outils GNU avec l'éditeur de liens LD), vous spécifiez simplement les fichiers de bibliothèque (.lib ou .a) comme entrée pour l'éditeur de liens. La plupart du temps, la bibliothèque est accompagnée de fichiers d'en-tête qui contiennent les définitions des prototypes de fonction.

Même si vous ne connaissiez pas le linker, ce qui est assez étrange, les bibliothèques sont toujours utilisées dans votre programme de manière implicite - le std::cout est dans la libstdc++ ou la C Run-Time Library.

Comme exemple d'une énorme bibliothèque et d'un ensemble utile de classes C++, vous pouvez consulter Boost.

Pour écrire une interface graphique sous Windows, vous pouvez utiliser la WinAPI qui est décrite dans MSDN.

Pour écrire une interface graphique sur Mac, vous pouvez utiliser l'API Carbon qui est quelque peu similaire à l'API Win, mais qui est maintenant dépréciée. La seule façon d'écrire une interface graphique "légitime" pour MacOS est d'utiliser Cocoa et Objective-C.

Pour écrire une interface graphique multiplateforme, vous pouvez utiliser un grand nombre de bibliothèques : Qt, wxWidgets, GTK entre autres.

Le dernier, mais non le moindre. Le C++ n'est pas le meilleur langage pour les interfaces graphiques.

2voto

La meilleure façon d'utiliser des bibliothèques C++ externes est d'utiliser un gestionnaire de paquets C++, allez en apprendre un :

Certaines d'entre elles impliquent l'utilisation de CMake, vous pouvez trouver un tutoriel bien écrit à ce sujet. ici .

.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X