Maison  >  Article  >  Opération et maintenance  >  Explication détaillée de la compilation g++ et de l'utilisation des bibliothèques statiques et dynamiques sous Linux

Explication détaillée de la compilation g++ et de l'utilisation des bibliothèques statiques et dynamiques sous Linux

黄舟
黄舟original
2017-05-28 11:32:404679parcourir

L'éditeur ci-dessous vous apportera un articleCompilation G++ et utilisation sous LinuxStatiqueLe méthode de bibliothèque et bibliothèque dynamique. L'éditeur pense que c'est plutôt bien, je vais donc la partager avec vous maintenant et lui donner une référence.

Dans l'environnement WindowsDans le cadre du projet, nous Nous développons généralement des projets C++ dans des IDE tels que VS. Nous pouvons être familiers avec la génération et l'utilisation de bibliothèques statiques (*.lib) et de bibliothèques dynamiques (*.dll). un autre ensemble de modes. Les bibliothèques statiques (*.a) et dynamiques correspondantes (*.so) sont générées et utilisées de différentes manières. Vous n'êtes peut-être pas à l'aise avec cela au début, mais vous devriez l'utiliser davantage. habitué à ce genre d'utilisation, car les étapes ne sont pas aussi compliquées que la configuration sous VS

Voici un résumé des méthodes de génération et d'utilisation des bibliothèques statiques et des bibliothèques dynamiques sous Linux : (Depuis c'est un projet C++, donc le compilateur utilise g++, mais c'est la même chose que l'utilisation de gcc)

Le premier est le travail de préparation, qui consiste à encapsuler le fonctions dont nous avons besoin dans un fichier de bibliothèque. Le fichier d'en-tête et le fichier source sont écrits comme suit :

//myAPI.h 
int ADD(int a, int b); 
int MINUS(int a, int b);
//myAPI.cpp 
#include "myAPI.h" 
 
int ADD(int a, int b){ 
  return a + b; 
} 
 
int MINUS(int a, int b){ 
  return a - b; 
}

Ensuite, préparez un fichier source de fonction principale pour les tests :

//main.cpp 
#include "myAPI.h" 
#include <iostream> 
 
int main(){ 
  std::cout << "1 + 1 = " << ADD(1, 1) << std::endl; 
  std::cout << "1 - 1 = " << MINUS(1, 1) << std::endl; 
  return 0; 
}

Enfin, compilez notre Le fichier myAPI.cpp génère le fichier cible myAPI.o

g++ -c myAPI.cpp

1. Générez une bibliothèque statique et utilisez

pour générer une bibliothèque statique sous Linux La commande ar traite le fichier myAPI.o pour générer un fichier de bibliothèque statique. Le fichier de bibliothèque généré doit suivre les spécifications, et le fichier de bibliothèque sous Linux doit être préfixé par ". lib". Par conséquent, pour cet exemple, la bibliothèque statique libmyAPI.a peut être générée via la commande suivante :

ar crv libmyAPI.a myAPI.o
Ensuite, vous pouvez utiliser la bibliothèque statique pendant le processus de compilation du projet. À ce stade, le fichier de définition de la fonction bibliothèque myAPI.cpp n'est plus nécessaire. La commande de compilation main.cpp est la suivante (notez que les dépendances sont les suivantes. Les fichiers de bibliothèque statiques doivent être placés après les dépendances) :

g++ main.cpp libmyAPI.a -o output
Une fois la compilation réussie, la sortie du fichier exécutable peut être exécutée. À ce stade, libmyAPI.a n'est plus nécessaire pour exécuter la commande et afficher les résultats comme suit :

./output
<.>

2. Générer une bibliothèque dynamique et utiliser pour passer lors de la compilation sous Linux Le paramètre -shared peut générer une bibliothèque dynamique ( .so), comme suit

. La bibliothèque dynamique générée doit être déclarée lors de la compilation et doit dépendre de celle-ci pendant l'exécution. La déclaration est la suivante
g++ -shared -fPIC -o libmyAPI.so myAPI.o

. . L'indicateur "-L." indique à G++ que la bibliothèque de fonctions peut être située dans le répertoire courant ; utilisez l'indicateur "-lmyAPI" pour indiquer au programme G++
g++ main.cpp -L. -lmyAPI -o output
pilote

de référencer la bibliothèque de fonctions partagée . libmyAPI.so pendant la phase de liaison. Si l'erreur suivante s'affiche lors de son utilisation, déplacez simplement libmyAPI.so vers le répertoire /usr/lib :

./output

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn