Parfois, il est nécessaire d'appeler la bibliothèque C++ sous le programme C. Après avoir lu beaucoup d'articles, soit les mots sont trop profonds et redondants pour être compris d'un coup, soit les exemples sont trop simples à comprendre ou à ne pas utiliser, alors ce blog prend Un compromis entre les deux, en donnant des explications simples et faciles à comprendre, et en donnant des exemples.
Tout d'abord, les noms de fonction générés après la compilation d'une fonction en C et C++ sont différents, donc les deux ne peuvent pas être utilisés en commun, même si C++ est utilisé pour appeler la bibliothèque dynamique compilée par le programme C, ce n'est pas autorisé, et vice versa. Alors, comment C appelle-t-il C++ ? interface.cpp
La réponse est d'écrire un programme d'interface.Le fichier de ce programme d'interface est chargé d'encapsuler les fonctions spécifiques de la bibliothèque C++ dans les fonctions C, et le fichier d'en-tête interface.h
est appelé par la fonction principale. Il est plus facile de voir un exemple, jetons un coup d'œil.
Supposons d'abord qu'il existe un programme C++ test.cpp
ettest.hpp
// test.hpp 文件内容:定义了ClassA类
class ClassA{
public:
void func(int a);
};
// test.cpp 文件内容:实现了ClassA::func(int a)函数
#include <iostream>
#include "test.hpp"
using namespace std;
void ClassA::func(int a){
cout<<"class A: "<<a<<endl;
}
En supposant qu'il s'agit d'un programme C++ que nous avons déjà, comment main.c
l'appeler dans un programme C ? La réponse est d'écrire une interface interface
.
// interface.h文件内容
#ifdef __cplusplus
extern "C"{
#endif
void func(int a);
#ifdef __cplusplus
}
#endif
// interface.cpp 文件内容
#include "test.hpp"
#include "interface.h"
void func(int a){
ClassA c;
c.func(a);
}
Ce qui précède est le pont reliant la bibliothèque C++ et le programme C. La partie interface.h
ci -jointe signifie compiler le programme C. L'instruction est activée lorsqu'une macro est définie , et cette macro est automatiquement compilée lorsque g++ est utilisé. Si elle est compilée en langage C, la macro ne sera pas définie , et naturellement elle ne sera pas activée (le langage C ne la reconnaît pas , il faut donc la basculer avec une macro). Dans le programme, la fonction C++ est encapsulée en tant que fonction de style C pour appeler dans main.extern "C"{}
extern "C"{}
__cplusplus
__cplusplus
extern "C"{}
extern "C"{}
Interface.cpp
test.cpp
Ici, vous pouvez remarquer que Interface
le fichier d'implémentation est .cpp
, et le fichier d'en-tête est .h
, qui est utilisé par les programmes C pour .cpp
lier la bibliothèque C++ .h
. C'est vraiment déroutant après avoir lu ceci, vous pouvez vous faire une idée générale pour le moment, et quand nous parlerons de la fonction principale, nous reviendrons en arrière et la comprendrons. À ce stade, la bibliothèque C++ et l'interface peuvent être compilées conjointement dans libtest.so
une bibliothèque dynamique
g++ test.cpp interface.cpp -shared -fPIC -o libtest.so
Enfin arrivé à la fonction principale, comme suit
// main.c 文件内容
#include "interface.h"
int main()
{
func(1);
}
Maintenant, nous devons compiler la fonction principale comme suit :
gcc main.c ./libtest.so -o main
Autrement dit, le programme en langage C appelle la bibliothèque de programmes C++. Résumons maintenant, il s'agit d'écrire une interface de package, le fichier cpp d'implémentation spécifique de l'interface est utilisé pour empaqueter la bibliothèque C++ dans une interface lisible du programme C, et le fichier d'en-tête .h de l'interface est utilisé pour être appelé par le programme C. Ensuite, les lecteurs se demanderont pourquoi il n'est pas nécessaire d'ajouter le commutateur de contrôle de définition de macro dans interface.h . En effet, interface.h est appelé par et en même temps .Le premier doit être compilé en mode C++, et le second doit être compilé en mode C, ce qui nécessite un commutateur__cplusplus
extern "C"
interface.cpp
main.c
.
extern "C"
Ne cherchez pas d'autres tutos, ce blog est l'article que vous trouverez le plus susceptible de vous aider à comprendre , après l'avoir lu plusieurs fois et mis en oeuvre à la main, vous comprendrez.
Remarques :
1. La différence entre gcc et g++ n'est pas que le premier est utilisé pour compiler des programmes c, tandis que le second est utilisé pour compiler des programmes c++.Pour les programmes simples, .cpp
gcc peut également être utilisé pour les compiler. Le noyau de g++ est toujours gcc, mais certaines définitions de macros et bibliothèques sont ajoutées par défaut. En bref, gcc ne peut pas être simplement considéré comme utilisé pour compiler des programmes c, et g++ est utilisé pour compiler des programmes c++. Les lecteurs intéressés peuvent se référer à des informations plus détaillées.