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 :

Problème d'include de librairie


Sujet :

C++

  1. #21
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 343
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    les undefined_reference sont des erreurs de link
    Oops anéfé...

  2. #22
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 407
    Par défaut
    Citation Envoyé par Eixurit Voir le message
    Par contre, pour-quoi faut il ajouter -lqrencode ?
    Pour lier ton code à la bibliothèque libqrencode.a, qui contient la définition des fonctions que tu utilises.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #23
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 343
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Eixurit Voir le message
    Par contre, pour-quoi faut il ajouter -lqrencode ?
    (de mémoire) -l c'est pour dire au compilateur qu'il faut linker avec une bibliothèque, donc -lqrencode ça lui dit de linker avec la lib qrencode.

    La commande de compilation est écrite en couleur sous le code de l'exemple dans la page où tu l'as récupéré. Je n'en ai pas fais allusion tant j'étais persuadé que c'est avec ça que tu compilais. Tu liras 3 fois la Bjible ce week-end pour ta punition! Et moi aussi, j'en aurais bien besoin visiblement

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    C'est clair que je suis un peu un boulet, mais bon, j'ai appris des choses, c'est ça qu'il faut voir héhé

    Merci les amis

  5. #25
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Plus précisément, pour dire au linker, "utilise le nom de bibliothèque 'qrencode', que tu iras chercher dans ton chemin de recherche". Chemin qui est définissable avec -Lchemin.

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    J'ai donc finalement réussi à inclure ma librairie, et fait le développement adéquat un peu à l'arrache dans mon main pour arriver à ce que je voulais.

    Maintenant je veux "organiser" mon code, j'ai créer une classe QRtools. J'ai donc à coté de mon fichier main.cpp un fichier qrtools.h avec mes définitions et un fichier qrtools.cpp avec mes fonctions.

    J'ai bien ajouté en haut de mon fichier qrtools.cpp un #include "qrtools.h" , j'en ai également ajouté un dans mon main.cpp.

    J'obtiens une erreur quand je lance mon programme avec cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ main.cpp -o main -lqrencode
    L'erreur :
    undefined reference to `QRtools::binarize(QRcode*)'

    Or si j'ai bien compris, c'est un problème de link, donc il ne trouve pas le qrtools.cpp

    J'ai bien essayer avec d'autre option de ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ main.cpp -o main -lqrencode -lqrtools
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ main.cpp -o main -lqrencode L-/home/***/ -lqrtools
    Mais bon, j'essayer un peu n'importe quoi dans le doute quoi ....

    Si une âme charitable pouvait m'expliquer à comprendre la source de mon problème

  7. #27
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par Eixurit Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ main.cpp -o main -lqrencode
    Chaque fichier contenant du code (.cpp) est compilé en un fichier objet (.o ou .obj en général)
    Et le linker derrière regroupe tous ça + les librairies utilisées dans le binaire généré.

    Ici, tu ne compiles que main.cpp, l'implémentation de ta classe QRtools n'est pas compilée et est donc manquante pendant le link.

    Le mieux serait d'utiliser un Makefile ou n'importe quel système de build (cmake / qmake / ou autre).
    La dessus je ne peux pas trop t'aider (j'ai l'habitude de Visual Studio qui marche sans poser trop de questions ^^)

    Pour dépanner, g++ *.cpp -o main -lqrencode marchera,
    mais l'utilisation de Makefile te simplifiera vraiment la vie.
    (Et réduira le temps de compilation en ne faisant pas un full rebuild à chaque coup)

  8. #28
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Eixurit Voir le message
    Merci, iradrille, c'était exactement ça le problème, maintenant j'arrive à compiler avec gcc et g++ !!

    Par contre, pour-quoi faut il ajouter -lqrencode ?
    Simplement parce que, par défaut, il n'y a qu'un certain nombre (assez restreint en fait ) de bibliothèques qui sont automatiquement utilisée lors de l'édition de liens.

    Tu admettras très certainement qu'il serait dommage de demander à ld (l'éditeur de liens sous linux) de rechercher l'implémentation de fonctions propres à qrencode, ou n'importe quelle autre bibliothèque "externe" alors que tu ne l'utilises absolument pas (ce qui sera sans doute vrai pour la plupart de tes projets )

    Du coup, lorsque tu veux utiliser une bibliothèque externe, il faut indiquer explicitement à gcc/g++ (qui se chargera de le transmettre à ld au moment opportun) qu'il doit aller chercher dans cette bibliothèque particulière l'implémentation des fonctions qui s'y rapportent.

    Pour ce faire, on peut préciser deux arguments différents et indépendants:
    1. Le dossier dans lequel il faut aller chercher après les .a / .so (vu que tu es sous linux ) avec l'option -L<nom de dossier>
    2. le nom de la bibliothèque à utiliser (sans le "lib" de debut ni le ".a" ou le ".so" de fin) avec l'option -l<nom de bibliothèque> (L minuscule)
    Le fait de rajouter l'option de compilation -lqrencode indique au compilateur qu'il doit dire à ld d'aller voir dans la bibliothèque (lib)qrencode(.a / .so) après les fonctions qui s'y rapporte.

    Si tu as toujours une erreur du genre "unable to find libqrencode" à l'édition de liens, il faudra également rajouter l'option -L<chemin/vers/dossier/contenant/libqrencode.a> à ta ligne de compilation
    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

  9. #29
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    Je comprends mieux maintenant. J'avoue que quand j’utilisais Visual Studio ou autre à l'école, je me posais aucune question sur comment ça fonctionnait derrière ... Évidemment, je regrette aujourd'hui

    Sur les conseils de Iradrille, je me suis mis à Cmake pour gérer mon petit projet.
    J'ai réussi à le faire fonctionner avec un main.cpp et un test.h et test.cpp à coté.
    Mais lorsque je souhaite l'adapter à mon projet, je suis encore confronté à cette librairie qrencode !!!
    Car bien entendu, il ne la trouve pas. Et comme son emplacement n'est pas juste à coté de mon main.cpp, je ne trouve pas le moyen de la linker.

    J'ai bien entendu essayer ça dans mon CMakeLists.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #Declaration du projet
    project(Qrcode)
     
    #Declaration de l'executable
    add_executable(
    	Qrcode
    	qrtools.h
    	qrtools.cpp
    	main.cpp
    )
    Et assez logiquement, ça ne fonctionne pas puisqu'il ne trouve pas la librairie qrencode.

    J'ai essayé d'ajouter qrencode.h et cpp dans add_exectubale, sans succès, puis ensuite avec l'appel grace à find_package, mais évidemment sans succès aussi.

    Je ne comprends pas comment je dois m'y prendre pour ajouter une librairie externe comme qrencode ?

  10. #30
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Allez, un petit lien (désolé, il est en anglais) pour t'aider
    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

  11. #31
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    Merci pour le lien.

    Néanmoins je n'ai pas réussi à résoudre mon problème avec, car ce que j'ai compris, c'est que ça ne traite que les librairies avec un package pour Cmake (existant ou qu'on trouve sur internet) or qrencode n'en dispose pas.

    Ce que je sais, c'est que libqrencode.la et libqrencode.so se trouvent dans
    /usr/lib, j'ai donc tenté le code ci-dessous, sans bien comprendre ce que je faisais :

    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
     
    CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
    #Declaration du projet
    project(Qrcode)
     
    #Inclusion de librairie externe
    include_directories("/usr/lib")
    target_link_libraries(libqrencode /usr/lib/libqrencode.so)
     
    #Declaration de l'executable
    add_executable(
            Qrcode
            qrtools.h
            qrtools.cpp
            main.cpp
    )
    Évidemment, ça ne fonctionne pas, mais comme c'est un peu tout nouveau pour moi, je comprends pas tout bien ...

    Quoi qu'il en soit, merci pour vos aides respectives très utiles

  12. #32
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    Je viens d'essayer en ajoutant un Flag, me disant qu'en ajoutant la librairie de cette façon, ça pouvait avoir une chance de fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set (CMAKE_CXX_FLAGS "-lqrencode")
    Bon bien évidemment non, et je reste toujours bloqué, incapable de compiler mon programme avec cette librairie dans Cmake

  13. #33
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    Alors à force de tester, j'ai réussi par trouvé.

    L'erreur venait de deux choses :

    - Je plaçais la fonction target_link_library avant le add_executable. Or il faut le placer après.
    - Enfin, cette fonction, qui prend deux paramètres, je ne l'avais pas comprise. Le premier doit être le nom du futur exécutable, et le deuxième, le nom de la librairie.

    Mon CMakeLists.txt se compose maintenant de la sorte :
    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
     
    CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
     
    #Declaration du projet
    project(Qrcode)
     
    #Declaration du dossier de sortie de l'executable
    set(EXECUTABLE_OUTPUT_PATH ../Qrcode-build/${CMAKE_BUILD_TYPE})
     
    #Messages
    message("rep source du projet: ${Qrcode_SOURCE_DIR}}")
    message("rep compilation du projet: ${Qrcode_BINARY_DIR}")
     
    #Ajout automatique des fichiers .cpp et .h
    file(GLOB_RECURSE source_files src/*)
    file(GLOB_RECURSE header_files include/* )
     
    #Declaration de l'executable
    add_executable(
    	Qrcode.cgi
    	${source_files}
    	${header_files}
    )
     
    #Declaration des librairies
    target_link_libraries(Qrcode.cgi /usr/lib/libqrencode.so)

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [PHPPowerPoint] Problème d'include
    Par edelacro dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 02/02/2011, 00h44
  2. problèmes avec "include file" pour une page asp
    Par chipsense dans le forum ASP
    Réponses: 1
    Dernier message: 02/09/2005, 15h22
  3. Problème pour lier une librairie... (ANTLR)
    Par loupdeau dans le forum MFC
    Réponses: 4
    Dernier message: 03/06/2005, 10h12
  4. [JSP] problème d'include ou d'import
    Par lipao17 dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 06/04/2005, 13h39
  5. Problème d'include sous Dev-c++ 4.9.8.0
    Par Argonz dans le forum Dev-C++
    Réponses: 16
    Dernier message: 20/11/2003, 17h36

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