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

Langage C++ Discussion :

Erreur de compilation fichier avec multiples headers


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 5
    Points
    5
    Par défaut Erreur de compilation fichier avec multiples headers
    Bonjour à tous,

    Je suis débutant en C++ (connaissant un peu le C, je pensais m'en sortir avec ce souci mais il s'avère que je reste étrangement coincé...)
    J'ai récupéré la librairie de chiffrement homomorphe FHEW disponible ici: http://github.com/lducas/FHEW

    Tout marche bien, dans l'installation et les tests mais quand j'écris mon propre code, impossible de le compiler. J'ai donc (pour m'assurer que j'écrivais correctement) tout simplement essayé de recompiler le fichier fhewTest.cpp disponible dans le dossier, sans succès. Est-ce que quelqu'un aurait une idée de comment réaliser ma compilation avec g++? Peut-être que j'ai manqué une option lors de la compilation?

    En espérant que je comprenne mieux ces histoires de compilation...

    Je vous remercie,
    Robin

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 29
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par Nashtare Voir le message
    [...] mais quand j'écris mon propre code, impossible de le compiler. J'ai donc (pour m'assurer que j'écrivais correctement) tout simplement essayé de recompiler le fichier fhewTest.cpp disponible dans le dossier, sans succès.[...]
    Si tu ne nous explique pas ce que tu fais, ça va être difficile de le deviner à ta place.

    Quand on créer un exécutable ou une librairie, on ne fait pas uniquement de la compilation. Tu peux diviser la création en trois étapes :
    1. Passage du pré-processeur sur le code
    2. La compilation des sources
    3. L'édition de liens


    Dans le projet que tu cites, tu verras qu'il y a un makefile dedans, ce dernier contient les instructions pour que ces étapes fonctionnent correctement. Après que ce soit make qui soit utilisé pour appeler g++ et ld ou autre chose, le principe reste tout le temps le même.

    Je te conseil d'aller lire cette page pour avoir les idées claires sur ce qui se passe : https://fr.wikibooks.org/wiki/Progra...2B/Compilation

    Ensuite, quand tu auras une erreur, tu pourras la lier à la phase concernée et du coup mieux comprendre d'où le problème vient.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Désolé du temps de d'attente, mon ordi était parti en réparation...
    J'ai fait g++ (les fichiers.cpp utilisés) monfichier.cpp -o output en ligne de commande mais rien n'y fait... Il me semble pourtant que c'est la bonne commande étant donné ce que j'ai vu sur internet à ce sujet..
    J'obtiens ces erreurs de compilation:
    Nom : error.png
Affichages : 161
Taille : 127,6 Ko

    Je répète que je n'ai rien changé au fichier test, dont l'entête est:

    Nom : test1.png
Affichages : 171
Taille : 7,3 Ko

    et les appels de fonction dans le main sont comme ci-dessous:

    Nom : test2.png
Affichages : 154
Taille : 18,3 Ko

    Je croyais que le Makefile était seulement pour "générer" la bibliothèque (mes excuses si j'emploie de mauvais termes), dois-je l'utiliser encore après?

    Merci d'avance,

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ce ne sont pas des erreurs de compilation mais de linker. L'éditeur de lien ne trouve pas les fonctions parce que tu oublies surement les options -l. Mais sans la ligne complète que tu utilises, seul un voudou pourrait l'assurer.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Ma ligne complète ne diffère pas vraiment du prototype que j'ai écrit plus haut cela étant.. J'utilise ceci:

    "g++ LWE.cpp FHEW.cpp distrib.cpp test.cpp -o test"

    je n'ai vu nulle part dans les différents forums ou des personnes avaient un souci similaire au mien ce "-l", à quoi sert-il?

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Pour info : https://c.developpez.com/faq/?page=G...mbol-not-found

    Et sinon pourquoi mettre des images alors que tu peux copier / coller du texte et le placer dans les balises [CODE][/CODE] pour poster du code ou [pre][/pre] pour mettre ce que tu as dans ta console ? Tu obtiens ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int a = 42;
    void f() {
        // ...
    }
    $ man woman
    No manual entry for woman



    PS : https://github.com/lducas/FHEW/blob/master/README.md il y a moyen de faire une bibliothèque avec tout ça, grâce au makefile. Mais sinon je pense qu'il te manque FFT.cpp non ? Et sinon la section Requirements te dit de télécharger une bibliothèque, tu l'as fait ?

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Désolé pour les balises..

    Oui en effet j'avais zappé ici le FFT.cpp mais je l'avais ajouté sur mes tests et ça ne marchait toujours pas. La bibliotèque FFTW3 à installer à bien été installée avant d'utiliser le Makefile, sans souci apparent..

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 79
    Points
    79
    Par défaut
    Hello,

    Tu as plusieurs solutions pour compiler ton programme avec cette librairie.
    1. compiler la lib FHEW une fois pour toutes, et l'utiliser pour chaque nouveau programme.
    2. systématiquement inclure tous les fichiers *.cpp importants de FHEW dans ta ligne de compilation.


    Ma préférence va au choix 1.
    Voici comment procéder :


    Et tout devrait fonctionner sans problème.
    Dis moi si tu as encore des soucis.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Hello!

    Alors non ça ne marche toujours pas, toutefois j'ai l'impression qu'il y a du changement..
    J'ai réalisé l'installation à nouveau de la librairie (quelle est la différence avec ce "-dev" que tu as précisé? pourquoi est-ce nécessaire?).
    Cependant, je pense que l'erreur vient du make, quand je le fais j'obtiens le message

    make: Nothing to be done for 'all'. Je dois bien le faire dans le dossier FHEW-master obtenu après décompression de l'archive contenant tous les fichiers de la librairie FHEW, n'est-ce pas?

    Nom : errorNEW.png
Affichages : 162
Taille : 77,9 Ko

    Voici l'erreur obtenue, je dois avouer que là je suis complètement perdu..

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 79
    Points
    79
    Par défaut
    Concernant l'installation du packet *-dev, il est nécessaire si tu as besoin de faire des développements en utilisant cette librairie, ce qui est ton cas. Il va notemment installer les fichiers en-tête de la librairie (*.h).

    Ensuite, pour le lancement du make, oui c'est bien dans le répertoire FHEW-master que tu dois le lancer. En revanche, dans le doute, fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ make clean && make libfhew.a
    Tu devrais obtenir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ make libfhew.a
    g++ -ansi -Wall -O3 -c distrib.cpp
    g++ -ansi -Wall -O3 -c FFT.cpp
    g++ -ansi -Wall -O3 -c LWE.cpp
    g++ -ansi -Wall -O3 -c FHEW.cpp
    ar -q libfhew.a distrib.o FFT.o LWE.o FHEW.o
    ar: creating libfhew.a
    Si tu obtiens des erreurs, copie les ici, pour aider à comprendre ton problème.

    Ensuite, tu peux lancer la compilation.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Alors j'obtiens bien le message indiqué après la commande "make clean && make libfhew.a", mais j'ai toujours le même message d'erreur lors de la compilation du fichier test..

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 79
    Points
    79
    Par défaut
    Je veux bien prendre le temps de t'aider, mais il va falloir que tu me donnes un peu plus d'info...

    Copie sur le forum toutes les commandes que tu rentres. Mets également ton fichier de test.
    J'ai aussi besoin de savoir à partir de quel répertoire tu lances tes compilations.
    Et ultime recours, copie ici la sortie de la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -v -ansi -Wall libfhew.a test.cpp -o test -lfftw3

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Alors comme je l'ai dit plus haut, mon fichier test.cpp est tout simplement le fichier fhewTest.cpp que j'ai recopié, pour tester avec un fichier "valide" si on peut dire.
    Donc de ce côté là, on peut espérer qu'il n'y a pas de souci.
    Je lance mes commandes à partir du répertoire FHEW-master contenant tous les fichiers de la librairie FHEW.

    Dans l'ordre, j'ai rentré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo apt-get install libfftw3-dev
    -> pas de souci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    make clean && make libfhew.a
    -> pas de souci (j'ai bien ce que tu avais indiqué)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -ansi -Wall libfhew.a ton_fichier.cpp -o test -lfftw3
    -> erreur:

    Nom : new.png
Affichages : 151
Taille : 69,5 Ko

    Il me semble que j'ai bien fait ce qu'on me demande là pourtant

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    On pourrait avoir le code sous forme de texte pour reproduire ?

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Le code est comme je l'ai dit celui fourni dans le dossier sous le nom de fhewTest.cpp, sans aucune altération.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    #include <iostream>
    #include <cstdlib>
    #include "LWE.h"
    #include "FHEW.h"
    #include "distrib.h"
     
    using namespace std;
     
    void help(char* cmd) {
      cerr << "\nusage: " << cmd << " n\n\n" 
      << "  Generate a secret key sk and evaluation key ek, and repeat the following test n times:\n"
      << "   - generate random bits b1,b2,b3,b4\n"
      << "   - compute ciphertexts c1, c2, c3 and c4 encrypting b1, b2, b3 and b4  under sk\n"
      << "   - homomorphically compute the encrypted (c1 NAND c2) NAND (c3 NAND c4) \n"
      << "   - decrypt all the intermediate results and check correctness \n"
      << "\n If any of the tests fails, print ERROR and stop immediately.\n\n";
      exit(0);
    }
     
    int cleartext_gate(int v1, int v2, BinGate gate){
      switch(gate)
      {
        case OR: return v1 || v2;
        case AND: return v1 && v2;
        case NOR: return not(v1 || v2);
        case NAND: return not(v1 && v2);
        default: cerr << "\n This gate does not exists \n"; exit(1); return 0;
      }
    }
     
    void cerr_gate(BinGate gate){
      switch(gate)
      {
        case OR: cerr << " OR\t"; return;
        case AND: cerr << " AND\t"; return;
        case NOR: cerr << " NOR\t"; return;
        case NAND: cerr << " NAND\t"; return;
      }
    }
     
     
    int main(int argc, char *argv[]) {
      if (argc != 2) help(argv[0]);
      int count = atoi(argv[1]); 
     
      cerr << "Setting up FHEW \n";
      FHEW::Setup();
      cerr << "Generating secret key ... ";
      LWE::SecretKey LWEsk;
      LWE::KeyGen(LWEsk);
      cerr << " Done.\n";
      cerr << "Generating evaluation key ... this may take a while ... ";
      FHEW::EvalKey EK;
      FHEW::KeyGen(&EK, LWEsk);
      cerr << " Done.\n\n";
      cerr << "Testing depth-2 homomorphic circuits " << count << " times.\n"; 
      cerr << "Circuit shape : (a GATE NOT(b)) GATE (c GATE d)\n\n";
     
      int v1,v2,sv1 = 2,sv2 = 2;
      LWE::CipherText se1, se2, e1, e2, e12;
     
      for (int i = 1; i <= 3*count; ++i) {
     
        if (i % 3){
          v1 = rand()%2;  
          v2 = rand()%2;
          LWE::Encrypt(&e1, LWEsk, v1);
          LWE::Encrypt(&e2, LWEsk, v2);
          if (i%3 == 1){
            cerr << "       NOT\tEnc(" << v2 << ") = ";
            FHEW::HomNOT(&e2, e2);
            int notv2 = LWE::Decrypt(LWEsk, e2);
            cerr << "Enc(" << notv2 << ")" << endl;
            if (not (notv2 == not(v2))){
              cerr << "\n ERROR: incorrect NOT Homomorphic computation at iteration " << i+1 << "\n";
              exit(1);
            }
            v2 = not v2;
          }
        }
        else { 
          v1 = sv1;
          v2 = sv2;
          e1 = se1;
          e2 = se2;
        }
     
        BinGate gate = static_cast<BinGate>(rand()%4);
     
        cerr << "Enc(" << v1 << ")";
        cerr_gate(gate);
        cerr << "Enc(" << v2 << ") = ";
     
        FHEW::HomGate(&e12, gate, EK, e1, e2);
        int v12 = LWE::Decrypt(LWEsk, e12);
     
        cerr << "Enc(" << v12 << ")";
        cerr << endl;
     
        if (i % 3 == 1){
          sv1 = v12;
          se1 = e12;
        }
        if (i % 3 == 2){
          sv2 = v12;
          se2 = e12;
        }
        if (i % 3 == 0)
          cerr << endl;
     
        if (cleartext_gate(v1, v2, gate) != v12) 
          { cerr << "\n ERROR: incorrect Homomorphic Gate computation at iteration " << i+1 << "\n"; 
        exit(1); 
      }
    }
     
    cerr << "\nPassed all tests!\n\n";
    }

  16. #16
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Pardon, je pensais que tu utilisais un fichier custom. Dans ce cas, pourquoi ne pas juste appeler make ou make fhewTest ? Le Makefile te fournit déjà tout ce dont tu as besoin

    D'ailleurs, en faisant make fhewTest, on voit comment ce fichier est compilé : g++ -ansi -Wall -O3 -o fhewTest fhewTest.cpp -L. -lfhew -lfftw3

    Mais sinon un simple g++ -ansi fhewTest.cpp libfhew.a -lfftw3 fonctionne chez moi.

    PS : je viens de comprendre... L'ordre est important dans les paramètres : d'abord le cpp, puis la lib fhew, puis la lib fftw3 !

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 5
    Points
    5
    Par défaut merci !
    Un grand grand merci pour toute votre aide, en effet en écrivant dans l'ordre mentionné ça marche enfin.

    Problème résolu, merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. erreur de compilation : probleme avec type de structure dans une classe
    Par medkarim dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 21/10/2008, 15h33
  2. erreur de recherche fichier avec getfile
    Par marbuly dans le forum Modélisation
    Réponses: 2
    Dernier message: 13/09/2007, 19h58
  3. Erreur de compilation C++ avec Makefile
    Par ChipsterJulien dans le forum C++
    Réponses: 2
    Dernier message: 27/08/2007, 18h27
  4. [Upload] upload fichiers avec multiple submit
    Par dolf13 dans le forum Langage
    Réponses: 17
    Dernier message: 06/06/2006, 01h20
  5. erreur de compilation - conflit avec Sleep
    Par timsah dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/02/2006, 17h52

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