web-dev-qa-db-fra.com

Comment utiliser les bibliothèques

Pour une raison quelconque, je ne peux jamais utiliser de bibliothèques externes dans aucune langue. Je cherche des instructions/explications sur l'utilisation des bibliothèques externes, ainsi que sur leur fonctionnement. Lorsque je fais des recherches en ligne, je reçois des fragments qui ne semblent jamais s'appliquer à la bibliothèque que je télécharge et que j'essaie et que j'utilise. Je travaille à la fois sur un mac et un pc, et les exemples en C++ vont bien. J'utilise Eclipse IDE avec le plug-in C++. S'il existe des instructions valables pour toutes les bibliothèques. 

54
sinθ

Supposons que vous ayez une classe Unuseful définie 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 nécessite d’imprimer des instructions inutiles:

Unuseful u;
u.printUnusefulStatement();

Cela signifie que vous souhaitez 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 (précédemment compilé pour votre architecture), à ​​l'éditeur de liens

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 le compiler avec votre code existant (par exemple, main.cpp fichier)… ... En général, vous êtes l’auteur et le créateur de la bibliothèque (une classe qui accomplit une tâche dont vous avez besoin).

Compiler avec cette commande:

g++ main.cpp unuseful.cpp

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

Cas 2: relier une bibliothèque

Plus souvent que Cas 1, vous ne disposez pas du code source de la bibliothèque que vous souhaitez utiliser. Vous ne disposez que du fichier d'en-tête (Unuseful.h, pour continuer avec l'exemple) et d'une bibliothèque static ou shared (probablement des fichiers [*] libunuseful.a et libunuseful.so, respectivement).

La bibliothèque statique est une archive de fichiers objets (*.o) liés dans les exécutables finaux. Les bibliothèques partagées sont chargées de manière dynamique - au moment de l'exécution (regardez cette page pour mieux comprendre la différence).

Les bibliothèques statiques sont créées en archivant simplement les fichiers *.o avec le programme 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

Les bibliothèques partagées sont créées avec l'option 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

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

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

Il est temps d'utiliser la bibliothèque:

g++ main.cpp -L. -lunuseful

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

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).

Étant donné que la bibliothèque partagée est chargée au moment de l'exécution, l'exécution de l'exécutable a.out peut échouer car le système n'est pas en mesure de trouver la bibliothèque . Cela peut généralement être résolu en définissant de manière appropriée une variable d'environnement indiquant les chemins à utiliser. rechercher des bibliothèques dynamiques:

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

C'est fait, votre exécutable a maintenant été compilé et il pourra exécuter et charger la bibliothèque dont il a besoin.

Conclusion

Ceci est un aperçu rapide des bibliothèques qui, je l’espère, peut vous aider à comprendre comment elles sont utilisées et fournies à d’autres.

Si vous êtes intéressé, vous devrez examiner de nombreux aspects plus en détail: options g++ lors de la création de bibliothèques partagées, options ar, variables d’environnement, format des bibliothèques partagées, etc.

[*]: Dans un environnement Unix

[**]: Si pris en charge par la machine cible, émettez un code indépendant de la position, adapté à la liaison dynamique et évitant toute limitation de la taille de la table de décalage globale. Cette option fait la 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. [De la page de manuel g ++]

145
Vincenzo Pii

Voici où vous commencez http://en.wikipedia.org/wiki/Library_(computing)

Fondamentalement, une 'bibliothèque' est un ensemble de fonctions compilées et de déclarations de classe.

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

Dans les langages gérés tels que Java ou C #, il existe des packages et des assemblys. Les 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 d'un fichier .a pour la plupart des compilateurs basés sur une chaîne d'outils POSIX ou GCC) et des prototypes des fonctions compilées dans le fichier .lib. En fonction de votre environnement de développement (pour Eclipse, vous utiliserez probablement le compilateur GCC et la chaîne d’outils GNU avec l’éditeur de liens LD), vous devez simplement spécifier les fichiers de bibliothèque (.lib ou .a) linker. La plupart du temps, la bibliothèque est accompagnée de fichiers d’en-tête contenant les définitions des prototypes de fonctions.

Même si vous ne connaissiez pas l'éditeur de liens, ce qui est assez étrange, les bibliothèques sont toujours utilisées de manière implicite dans votre programme - std :: cout se trouve dans libstdc ++ ou dans la bibliothèque d'exécution C.

En tant qu'exemple d'une immense bibliothèque et d'un ensemble utile de classes C++, vous voudrez peut-être examiner Boost.

Pour écrire l'interface graphique sous Windows, vous pouvez utiliser l'interface WinAPI décrite dans MSDN.

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

Pour écrire une interface graphique multi-plateforme, vous pouvez utiliser de nombreuses bibliothèques: Qt, wxWidgets, GTK.

Le dernier mais pas des moindres. C++ n'est pas le meilleur langage pour l'interface graphique.

6
Viktor Latypov

Le meilleur moyen d’utiliser les bibliothèques C++ externes est de faire appel à un gestionnaire de packages C++.

Certains d'entre eux impliquent l'utilisation de CMake, vous pouvez y trouver un tutoriel bien écrit ici .

0
adem