2012-12-21 4 views
1

Possible Duplicate:
How to call a lib written in C++ from C?Comment appeler une fonction C++ à partir de C?

Je bricoler avec pHash et je veux appeler la fonction pour générer un hachage perceptive de l'emplacement du fichier. Quand je tente d'appeler la fonction appelée ph_dct_imagehash le compilateur jette cette erreur:

/usr/include/CImg.h:72:18: fatal error: cstdio: No such file or directory 
compilation terminated. 

À ce stade, je me rends compte que phash est écrit en C++, donc y compris C++ en-têtes dans un programme C ne va pas au travail. Néanmoins, la fonction elle-même semble pouvoir être appelée par C car aucun de ses paramètres ni sa valeur de retour n'utilisent des constructions C++. Y at-il un bon moyen d'appeler la fonction C++ ph_dct_imagehash de C?

Note: Je fais cela principalement pour améliorer mon travail en C (pas en C++). C'est pourquoi je me limite à C.

Répondre

5

Tant que vous avez un nom de symbole démêlé à appeler, vous pouvez lier votre bibliothèque C++ avec votre programme C assez facilement. Vous voudrez créer un fichier d'en-tête C-safe ou un autre moyen de transmettre le nom de la fonction, puis simplement relier les choses à la fin (assurez-vous d'utiliser un éditeur de liens compatible C++!).

Voici un exemple simple:

$ cat cplusplus.cpp 
#include <string> 

extern "C" 
const char *cplusplusFunction(void) 
{ 
    static std::string a = "Hello, C++"; 
    return a.c_str(); 
} 
$ cat example.c 
#include <stdio.h> 

const char *cplusplusFunction(void); 

int main(void) 
{ 
    printf("%s\n", cplusplusFunction()); 
    return 0; 
} 
$ c++ -c -o cplusplus.o cplusplus.cpp 
$ cc -c -o example.o example.c 
$c++ -o example example.o cplusplus.o 
$ ./example 
Hello, C++ 
0

Si vous utilisez un compilateur C++ (par exemple g ++ au lieu de gcc), vous pouvez appeler le code C++ à partir de votre code C de façon transparente et tout fonctionnera très bien. Cela sera le cas puisque si vous faites quelque chose de vraiment étrange, C est contenu dans C++.

Et si cela ne fonctionne toujours pas lorsque vous compilez avec g ++, vous devriez changer le suffixe de fichier de .c à. cc, .cpp, .cxx, etc. De préférence .cc

+2

Sauf si le code que vous essayez de compiler utilise des mots réservés en C++, tels que new, class, typename, etc Et si vous avez plusieurs milliers de lignes de code, que vous voulez seulement en accrocher une petite partie en C++, cela pourrait très bien être un problème. –

+0

+1 @MatsPetersson. Ma bête noire personnelle est tout le casting autour de 'malloc'. "Fixer" tout cela peut être une corvée. –

2

Vous devrez séparer vos fonctions de code C++ du code C.

Généralement, cela se fait en ayant un fichier .h contenant uniquement les déclarations C (non C++) des fonctions et des structures de données C nécessaires pour résoudre le problème, et un fichier C++ contenant les fonctions d'interface C vers C++.

Vous aurez également besoin d'utiliser

#ifdef __cplusplus 
extern "C" { 
#endif 
.... your types and functions ... 
#ifdef __cplusplus 
} 
#endif 

dans votre fichier d'en-tête, pour faire en sorte que le compilateur C++ n'a pas « mangle » les noms (qui marque le type de paramètres dans le nom de la fonction, par exemple la fonction Blur (int x, int y) peut être appelée _Blur_ii, où C ne rajoute pas ce genre de "truc supplémentaire" sur le nom de la fonction, donc le compilateur C appellera _Blur - et bien sûr, le linker dit "Impossible de trouver _Blur" lorsque vous essayez de lier

Editer: De plus, assurez-vous à 100% que vous n'avez aucune exception "fuite" dans le code C. Si vous le faites, anythin g peut arriver, et ce n'est généralement pas de l'or qui tombe du ciel, mais plutôt de mauvaises choses ... :)

Questions connexes