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 avec alpr


Sujet :

Langage C++

  1. #1
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 174
    Points : 122
    Points
    122
    Par défaut Erreur de compilation avec alpr
    Bonjour,

    J'ai installé OpenAlpr.
    Tout fonctionne bien en mode commande dans une fenêtre cmd de Windows
    Je travaille avec Windows 10
    Je compile avec g++ en passant la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -mwindows essaiopenalpr.cpp -o essaiopenalpr.exe
    Voici mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
    #include <stdlib.h>
    #include <alpr.h>
    int main()
    {
        alpr::Alpr openalpr("us", "openalpr.conf");
        return 0;
    }
    openalpr.conf est placé avec le programme .cpp

    J'ai l'erreur suivante : je ne comprends pas ce que je doit faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C:\Users\JEANLO~1\AppData\Local\Temp\cc2ZbTzH.o:essaiopenalpr.cpp:(.text+0xa0): undefined reference to `alpr::Alpr::Alpr(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
    C:\Users\JEANLO~1\AppData\Local\Temp\cc2ZbTzH.o:essaiopenalpr.cpp:(.text+0xee): undefined reference to `alpr::Alpr::~Alpr()'
    collect2.exe: error: ld returned 1 exit status

    Merci de m'aider.

  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,

    Quand tu recois un message du type "undefined rerence to XXX", le monsieur se plaint de ne pas avoir trouvé le code binaire exécutable qui correspond à la fonction indiquée.

    C'est ce que l'on appelle une erreur "d'édition de liens", parce qu'elle est lancée par le tout dernier outil qui sera utilisé pour générer l'exécutable final, qui n'est autre que ... l'éditeur de liens.

    Son taf, à lui, consiste à regrouper l'ensemble des fichiers objets (les fichiers qui contiennent le code exécutable généré pour chacun des fichiers .cpp que le compilateur a traité) afin de fournir l'exécutable final.

    Il y a trois grandes raisons pour lesquelles ce genre d'erreur peut survenir:
    1. Parce que tu n'as pas écrit le code correspondant à la fonction indiquéee
    2. parce que tu n'as pas indiqué qu'il fallait prendre le fichier objet résultant de la compilation du fichier qui contient la fonction indiquée
    3. parce que c'est une fonction fournie par une "bibliothèque tierce" et que l'éditeur de lien ne savait pas qu'il devait aller voir à l'intérieur de celle qui contient le code correspondant (ou qu'il n'a pas trouvé la bibliothèque en question)

    Pour le cas qui nous occupe, il semble plus que vraisemblable que nous soyons face à la troisième situation indiquée, vu que les fonctions pour lesquelles l'éditeur de liens n'a pas trouvé le code binaire exécutable font partie de l'espace de noms alpr.

    Et c'est un peu normal, parce que, avec les milliers de bibliothèques qui existent, l'éditeur de liens ne vas pas s'amuser à aller chercher dans toutes les bibliothèques qu'il trouve pour voir s'il n'y trouverait pas "par hasard" le code qui l'intéresse.

    Du coup, si on veut qu'il aille spécifiquement regarder dans une bibliothèque bien particulière si il n'y trouve pas ce dont il a besoin, il faut le lui indiquer spécifiquement au travers de l'option -l<nom_de_la_bibliotheque> (attention, c'est un L minuscule) où <nom_de_la_bibliotheque> représente le nom du fichier correspondant à la bibliothèque sur le disque dur -- qui prend généralement la form de lib<nom_de_la_bibliotheque>.a -- mais sans le prefixe lib ni l'extension .a

    Ainsi, si le nom de la bibliothèque est libopenalpr.a (à vérifier sur ton systeme) la ligne de compilation devrait ressembler à quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -mwindows essaiopenalpr.cpp -o essaiopenalpr.exe -lopenalpr
    Mais il reste un autre problème potentiel : l'éditeur de liens n'ira chercher après les bibliothèques externes que dans les "quelques dossiers" dans lesquels on lui aura dit d'aller regarder; et ce pour la même raison que celle que j'ai indiquée plus haut : tu imagine s'il devait parcourir l'ensemble des dossiers que contient ton disque dur de 4Tb il en aurait pour la journée à générer un seul exécutable

    Et, donc, l'éditeur de liens connait quelques dossier (<dossier_du_compilateur> / lib, par exemple) dans lesquels il sait qu'il a "une chance" de peut-être trouver les bibliothèques dont il a besoin.

    Mais si la bibliothèque dont tu as besoin se trouve dans un dossier qui n'est pas connu par l'éditeur de liens comme "susceptible de contenir des bibliothèques", il faudra lui indiquer (à l'éditeur de liens) le dossier en question au travers de l'option de compilation -L<chemin_absolu_vers_dossier>Au final, si la bibliothèque dont tu as besoin est nommée libopenalpr.a et qu'elle se trouve dans le dossier E:\dossier\sous_dossier\lib, la ligne de commande prendra une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -mwindows essaiopenalpr.cpp -o essaiopenalpr.exe -LE:/dossier/sous_dossier/lib -lopenalpr
    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
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 174
    Points : 122
    Points
    122
    Par défaut
    koala01, je te remercie pour ce petit cours.
    Il y a des choses que je savais déjà, mais cela à permis de tout éclairer.
    Malheureusement cela ne résout pas mon problème.
    Je n'ai pas trouvé de .a (openalpr.a) dans mes répertoires.

    Voila ce que je possède dans mon répertoire de travail :

    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
     Répertoire de C:\Users\JeanLouis\Desktop\openalpr_64
     
    <DIR>          include
    <DIR>          samples
     alpr.exe
     essaiopenalpr.cpp
     liblept170.dll
     openalpr-net.dll
     openalpr-static.lib
     openalpr-utils-calibrate.exe
     openalpr-utils-tagplates.exe
     openalpr.conf
     openalpr.dll
     openalpr.lib
     openalprjni.dll
     openalprnet-windemo.exe
     openalprpy.dll
     opencv_ffmpeg300_64.dll
     opencv_world300.dll
    Dans INCLUDE, j'ai un seul fichier le alpr.h
    Dans SAMPLES j'ai des images de plaques de voitures

    Je fais la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -Wall -mwindows -LC:\Users\JeanLouis\Desktop\openalpr_64 -IC:\Users\JeanLouis\Desktop\openalpr_64/include essaiopenalpr.cpp -o essaiopenalpr.exe -lopenalpr
    j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C:\Users\JEANLO~1\AppData\Local\Temp\ccdQhize.o:essaiopenalpr.cpp:(.text+0xa0): undefined reference to `alpr::Alpr::Alpr(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
    C:\Users\JEANLO~1\AppData\Local\Temp\ccdQhize.o:essaiopenalpr.cpp:(.text+0xee): undefined reference to `alpr::Alpr::~Alpr()'
    collect2.exe: error: ld returned 1 exit status

  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, la forme lib<nom_bibliothèque>.a correspond à celle que l'éditeur de liens utililisée par Gcc (ld) va utiliser.

    D'autres fournisseurs de compilateurs utilisent (principalement sous windows) des noms prenant la forme de <nom_bibliothèque>.lib, si bien que tu dispose bel et bien (dans le dossier C:\Users\JeanLouis\Desktop\openalpr_64):
    • d'une version statique de la bibliothèque (au travers du fichier nommé openalpr-static.lib),qui permet de créer des applications "indépendantes" (pour lesquelles tu ne devras pas fournir la dll "en plus")
    • d'une "bibliothèque d'importation" permettant (au travers du fichier nommé openalpr.lib) à l'éditeur de liens de savoir tout ce dont il a besoin lorsque tu voudras utiliser la dll

    Manque de bol, cette forme pour les noms de fichiers semble indiquer que la bibliothèque a été compilée ... avec le compilateur de microsoft (visual studio). Or, gcc n'est pas capable d'utiliser les bibliothèques qui ont été créées par visual studio (pas plus que visual studio n'est capable d'utiliser les bibliothèque créés avec gcc) (*)

    (*) je simplifie, parce qu'il y a des exceptions, bien sur

    Par chance, le code source de cette bibliothèque est librement accessible ==>ici<== et, a priori, il utilise CMake pour la configuraiton du projet

    Les choses seront donc sans doute "un peu plus difficiles", car tu ne pourra pas te contenter de déziper le tout pour l'utiliser, et tu devra -- en plus -- compiler openalpr pour ton compilateur spécifique, mais cela n'a rien d'absolument insoluble.

    La seule chose, c'est -- pour être tout à fait honnête -- que je ne suis pas tout à fait sur que tu aies le "niveau requis" pour arriver à tout faire, au vu des questions que tu poses.

    Je n'ai --bien sur -- absolument rien contre l'idée de t'aider dans la manoeuvre, mais, la bonne question est : te sens-tu de taille à affronter le "coté obscure" de la configuration et de la compilation d'une bibliothèque externe uniquement pour pouvoir l'utiliser dans ton programme

    (note que, de toutes manières, rien de ce que pourra apprendre en te lançant dans l'aventure ne sera vraiment perdu pour la suite )
    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
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 174
    Points : 122
    Points
    122
    Par défaut
    Un très grand merci pour toi koala01,

    Donc, si je résume ce que tu me dis, il n'est pas possible de compiler en C ou en C++ avec le compilateur de mingw-w64 (g++ ou gcc) sur windows, parce que les sources de Openalpr ont été compilés avec le compilateur de microsoft (visual studio).

    Question 1 :
    Si je programme avec microsoft (visual studio), je n'aurai pas de problème ?
    Même question avec Python ?

    tu me dis :
    La seule chose, c'est -- pour être tout à fait honnête -- que je ne suis pas tout à fait sur que tu aies le "niveau requis" pour arriver à tout faire, au vu des questions que tu poses.
    Ben, tu as raison, je suis un vieux monsieur de bientôt 70 ans en mars, et j'ai des difficultés de lire l'Anglais, et je ne comprends pas toutes les méandres de ces techniques de compilation...... Mais je m'accroche....

    Tu me dis aussi :
    Je n'ai --bien sur -- absolument rien contre l'idée de t'aider dans la manœuvre, mais, la bonne question est : te sens-tu de taille à affronter le "coté obscure" de la configuration et de la compilation d'une bibliothèque externe uniquement pour pouvoir l'utiliser dans ton programme
    Je suis prêt a essayer si j'ai un bon professeur, et tu sembles être celui la..... alors on peut y aller, si tu guides mes pas.

    Par quoi faut-il commencer? je t'écoute et je te promets d'aller jusqu'au bout....
    Par contre je ne promets pas de ne pas être chiant, et, de te faire répéter plusieurs fois ce que tu me demandes de faire.....
    Si c'est aussi compliqué que tu as l'air de le dire, alors c'est toi qui va souffrir le plus de nous deux.......
    Merci encore.

  6. #6
    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
    Citation Envoyé par papilou86 Voir le message
    Un très grand merci pour toi koala01,

    Donc, si je résume ce que tu me dis, il n'est pas possible de compiler en C ou en C++ avec le compilateur de mingw-w64 (g++ ou gcc) sur windows, parce que les sources de Openalpr ont été compilés avec le compilateur de microsoft (visual studio).
    C'est effectivement le problème
    Question 1 :
    Si je programme avec microsoft (visual studio), je n'aurai pas de problème ?
    Même question avec Python ?
    Ah, si tu installe visual studio (dans sa version community, qui est la version gratuite bien que complète), ca devrait fonctionner sans problème majeur

    C'est un excellent EDI, qui fournit énormément de fonctionnalités. Mais c'est aussi un mastodonte qui nécessite un espace disque faramineux et qui prend un temps bête à télécharger et à installer tout ce dont il a besoin

    En ce qui concerne python, je t'avouerai que ... je ne sais pas trop, parce que je n'ai pas trop regardé à ce qui est fourni par openalpr

    Typiquement, la difficulté d'utiliser une bibliothèque C ou C++ avec python peut varier d'une extrême à l'autre.

    Car, avec un peu de chance, il y a un portage de la bibliothèque qui a déjà été fait, et tu peux donc utiliser ce portage comme n'importe quel module python.

    Mais, si tu as moins de chance, ce portage n'existe pas encore, et tu devras du coup développer toi même (avec boost-python, par exemple) "tout ce qu'il faut" pour pouvoir utiliser la bibliothèque avec python

    (Note que Visual studio peut aussi installer le nécessaire pour utiliser python, si tu le souhaite )

    Ben, tu as raison, je suis un vieux monsieur de bientôt 70 ans en mars, et j'ai des difficultés de lire l'Anglais, et je ne comprends pas toutes les méandres de ces techniques de compilation...... Mais je m'accroche....
    Bah, tu sais, ma maman aura 80 balais (en mai), et elle a décidé de suivre des cours d'informatique, pour pouvoir utiliser correctement son ordinateur sans avoir à appeler ses (petits) enfants à la rescousse

    Par contre, quand on se lance dans le développement, l'anglais est particulièrement utile, parce qu'une très grosse partie des ressources est écrite dans la langue de Shakespeare

    Par chance, les traducteur en ligne (comme google translate) font s'améliorent tous les jours, et les traduction "qui n'ont pas de sens" se font de plus en plus rares
    Je suis prêt a essayer si j'ai un bon professeur, et tu sembles être celui la..... alors on peut y aller, si tu guides mes pas.
    Merci... Mais je suis loin d'être le seul

    Et je ne doute absolument pas que tu y arrivera sans grosse difficultés, car ce n'est pas si compliqué que cela (la preuve: j'ai bien fini par comprendre )

    Mais j'ai aussi l'habitude de répéter qu'il faut savoir marcher avant de vouloir courir.

    Or, dés qu'on se lance dans un projet qui nécessite le recours à des éléments externes, quel que soit le langage envisagé, on s'attaque à des projets qui sont -- par nature -- bien plus complexes que le simple "hello world".

    Il y a donc vraiment intérêt à être "particulièrement à l'aise" avec le langage que l'on décide d'utiliser. Et, manque de bol, C++ compte parmi les langages les plus complexes que l'on puisse trouver

    Ne te connaissant "ni des lèvres ni des dents", je ne sais pas quel est ton niveau en C++. Et c'est ce qui me pose un problème moral majeur. Ne serait-ce que parce que, d'après ce que j'en ai vu, openalpr est un projet particulièrement complexe qui présente de nombreuses dépendances.

    Il se peut en effet que tu sois suffisamment à l'aise en C++ pour te lancer dans l'histoire, mais je sais par expérience qu'il vaut mieux y aller "un pas après l'autre", et que si tu te lances dans un projet "trop complexe" par rapport à ta maîtrise "des bases", tu n'arriveras à rien, et tu pourrais te décourager plus vite qu'il ne faut de temps pour l'écrire

    Je vais donc te laisser faire ton propre examen de conscience en laissant te demander quel est ton niveau de compréhension du C++ et te conseiller, si tu te rends honnêtement compte que tu n'en es qu'au tout début de ton apprentissage, de post-poser ce projet de quelques mois, le temps de te sentir réellement à l'aise avec le langage.

    Dis toi que, si tu prends cette décision -- particulièrement sensée -- il y a de fortes chances pour que, l'habitude venant de la répétition, tu n'aies même plus besoin de moi pour te guider lorsque tu ressortira ton projet des cartons

    Maintenant, si tu t'estimes suffisamment à l'aise avec C++ que pour tenter l'aventure, je reste tout à fait disposé à te guider pas à pas. La décision t'appartient
    Par quoi faut-il commencer? je t'écoute et je te promets d'aller jusqu'au bout....
    Une chose est sur, tu ne manques pas de motivation! C'est déjà un excellent point de départ
    Par contre je ne promets pas de ne pas être chiant, et, de te faire répéter plusieurs fois ce que tu me demandes de faire.....
    Bah, je ne me répéterai jamais plus que ce que je ne le fais déjà sur les différents forums, tu peux me croire
    Si c'est aussi compliqué que tu as l'air de le dire, alors c'est toi qui va souffrir le plus de nous deux.......
    Ce n'est pas compliqué en soi.

    A vrai dire, les choses sont souvent plus complexes que compliquées Ce qui implique "simplement" qu'il faut faire les choses "avec ordre et méthode": se sentir à l'aise avec le langage est la première étape, après il faut
    • comprendre "ce qui se passe" lors du processus de compilation
    • apprendre à utiliser certains outils de descriptions et de configuration de projets (comme CMake)
    • s'habituer à "différentes manières de faire"
    • ...

    Comme je viens de te le dire, j'aimerais que tu sois sur d'avoir atteint la première étape
    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

  7. #7
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 174
    Points : 122
    Points
    122
    Par défaut
    Merci et merci,

    Je pense que je vais être raisonnable, je ne me lancerai pas dans cette compilation.
    Je vais suivre tes conseils et je ne vais pas chercher à "péter plus au que mon derrière" comme l'on dit chez moi....

    Comme j'ai télécharger Visual studio 2017, je vais regarder ce que je peux faire avec. Il sera plus facile d'apprendre Visual studio me semble-t-il.

    Je continue mon projet, j'ai compris pourquoi je ne peux pas continuer avec mingw-w64 (g++ ou gcc) sur windows, et c'est cela le principal.

    Encore une fois merci,

    je clos ce fil de discussion.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Points : 26
    Points
    26
    Par défaut
    Je suis désolé mais je n'ai pas lu ce qu'il précède mais je voudrais ajouter que le github propose en fin de page de présentation différents liens permettant de recompiler le projet.
    Au lien suivant https://github.com/openalpr/openalpr...ions-(Windows), il y a un script powershell dans la partie easy way (qui demande tout de même un certain prérequis) qui permet de compiler alpr pour windows.

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

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