Oops anéfé... :oops:
Version imprimable
(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 :aie:
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 ;)
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.
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 :
L'erreur :Code:g++ main.cpp -o main -lqrencode
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:g++ main.cpp -o main -lqrencode -lqrtools
Mais bon, j'essayer un peu n'importe quoi dans le doute quoi ....Code:g++ main.cpp -o main -lqrencode L-/home/***/ -lqrtools
Si une âme charitable pouvait m'expliquer à comprendre la source de mon problème :)
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)
Salut,
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:
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.
- 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>
- 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)
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 ;)
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
Et assez logiquement, ça ne fonctionne pas puisqu'il ne trouve pas la librairie qrencode.Code:
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 )
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 ?
Allez, un petit lien (désolé, il est en anglais) pour t'aider
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 :
Évidemment, ça ne fonctionne pas, mais comme c'est un peu tout nouveau pour moi, je comprends pas tout bien ...Code:
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 )
Quoi qu'il en soit, merci pour vos aides respectives très utiles ;)
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 :
Bon bien évidemment non, et je reste toujours bloqué, incapable de compiler mon programme avec cette librairie dans Cmake :cry:Code:set (CMAKE_CXX_FLAGS "-lqrencode")
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:
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)