IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Utilisation de C++ en C


Sujet :

C++

  1. #1
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut Utilisation de C++ en C
    Je souhaite utiliser du code C++ depuis une application en C, mais il semblerait que j'aie manqué quelque chose car l'édition de lien ne fonctionne pas.

    Fichier hello.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
     
    class Hello {
    public:
      void print(){
        std::cout<<"Hello world\n";
      }
    };
     
    extern "C" {
      void Hello_print(){
        Hello().print();
      }
    }
    compilé avec la commande : g++ -c hello.cpp

    Fichier main.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    extern void Hello_print();
     
    int main(){
      Hello_print();
    }
    compilé avec la commande : gcc main.c hello.o
    message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Undefined symbols for architecture x86_64:
      "std::ios_base::Init::Init()", referenced from:
          __static_initialization_and_destruction_0(int, int)in hello.o
      "std::ios_base::Init::~Init()", referenced from:
          ___tcf_0 in hello.o
      "std::cout", referenced from:
          Hello::print()     in hello.o
      "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
          Hello::print()     in hello.o
    ld: symbol(s) not found for architecture x86_64
    collect2: ld returned 1 exit status
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    C'est normal: tu peux utiliser C (ou du moins une large part compatible) dans C++, mais C++ est un langage autrement plus complexe, qui nécessite des traitements bien plus compliqués que C.

    Pour pouvoir utiliser C++, le seul compilateur C ne suffit pas.

    Par contre, pour toute la part compatible de C, tu peux compiler du C avec un compilateur C++.

    Au final, bien que ton application soit en C, tu dois bel et bien utiliser le compilateur C++ pour arriver à ce que tu cherches à faire


    Dans le cas présent, la différence tient, essentiellement, au fait que par défaut Gcc ne va invoquer ld lors de l'édition de liens qu'avec les réglages propre aux bibliothèques C (libgcc en l'occurrence).

    Tu pourrait éventuellement t'en sortir en indiquant qu'il doit malgré tout également effectuer l'édition de liens avec la bibliothèque standard de C++ (-lstdc++) pour qu'il puisse, malgré tout, trouver les références vers les symboles C++
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Mon but est d'obtenir une bibliothèque, certes écrite en C++, mais qui puisse s'interfacer avec du C (ou des langages compatibles) de manière transparente.

    Tu es sur qu'il n'y a pas moyen de faire ça? Il me semblait pourtant que c'était possible.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    En fait, dés le moment où tu fournis une interface "extern C", les symboles créés seront décorés à la manière C, et donc accessible depuis C.

    Seulement, tu n'auras qu'une interface C qui... utilisera les possibilités de C++ à plus d'un terme:
    Soit parce que ton interface utilise en interne des classes et structure "C++" perso
    Soit parce que ton interface ou tes classes et structures C++ perso utilisent des éléments de la bibliothèque C++ (cout dans ton propre exemple).

    Ce qui est propre à C++ (classes, fonctions membres, utilisation de la bibliothèque C++) nécessite au minimum la compilation avec g++ (le compilateur C++ de la collection Gcc).

    Si certaines parties de ton code sont marquées "externC", g++ créera des symboles décorés "à la mode C" pour les parties correspondantes, ce qui les rendra accessibles depuis une application C.

    La seule chose qu'il te manquera alors, lorsque tu voudras compiler ton application C en utilisant l'interface C de ta bibliothèque, c'est la liaison avec la bibliothèque C++ (stdc++), parce que, par défaut, ld est lancé depuis Gcc (et non g++) sans l'option -stdc++ qui est automatiquement ajoutée quand ld est lancé depuis g++.

    Par contre, si tu prends la peine de rajouter cette option au moment où tu invoque gcc, ou au moment où tu invoques toi-même ld, il n'y aura plus de problème

    Ainsi, tu peux envisager d'avoir un commande sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc hello.c -lstdc++ -ltaLibPerso
    ou sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc hello.c -o hello.o
    ld hello.o -lstdc++ -ltaLibPerso -o nomExecutable
    Mais ce qui importe surtout, c'est que l'édition de liens se fasse bel et bien en ajoutant... libstdc++ comme bibliothèque à utiliser lors de la recherche des différents symboles utilisés par ton application
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Merci de ta réponse, mais lier la bibliothèque standard C++ à un programme C n'est clairement pas une solution propre.

    Finalement, j'ai réussi à résoudre mon problème en compilant sous forme de bibliothèque dynamique, ce qui est il est vrai bien plus logique plutôt que de lier directement le fichier objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    g++ -fPIC -shared hello.cpp -o libhello.so
    gcc -L. -lhello main.c

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Ce qui a fort probablement entraîné le lien avec lstdc++ par les dépendances de ta lib...

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo