Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de bibliothèques sous linux.

4 réponses
Avatar
Valrik
Bonjour à tous,
voilà mon problème qui en fait en cache beaucoup ! :-(
Je souhaite utiliser l'API Magick++ dans un petit programme.

Pour débuter, je voulais simplement compiler et modifier à ma sauce le petit
exemple qui suit :

#include <list>
#include <Magick++.h>
using namespace std;
using namespace Magick;

int main(int /*argc*/,char **/*argv*/)
{
list<Image> imageList;
readImages( &imageList, "test_image_anim.gif" );

Image appended;
appendImages( &appended, imageList.begin(), imageList.end() );
appended.write( "appended_image.miff" );
return 0;
}
Rien de bien méchant, sommes toutes.

Mais lorsque j'essaie de le compiler à l'aide la ligne suivante :
$ g++ essai.cpp
GCC me retourne les messages :
/tmp/ccYyxmBf.o: In function `main':
essai.cpp:(.text+0x9f): undefined reference to `Magick::Image::Image()'
essai.cpp:(.text+0x145): undefined reference to
`Magick::Image::write(std::basic_string<char, std::char_traits<char>,
std::allocator<char> > const&)'
essai.cpp:(.text+0x19a): undefined reference to `Magick::Image::~Image()'
essai.cpp:(.text+0x1d2): undefined reference to `Magick::Image::~Image()'
/tmp/ccYyxmBf.o: In function
`__gnu_cxx::new_allocator<Magick::Image>::construct(Magick::Image*,
Magick::Image const&)':
essai.cpp
(.text._ZN9__gnu_cxx13new_allocatorIN6Magick5ImageEE9constructEPS2_RKS2_[__gnu_cxx::new_allocator<Magick::Image>::construct(Magick::Image*,
Magick::Image const&)]+0x38): undefined reference to
`Magick::Image::Image(Magick::Image const&)' ... Et plein d'autres !

Il me semble que c'est un problème de bibliothèque et d'éditeur de liens...
Alors, afin de voir si j'avais des bibliothèques adéquates, j'ai fait :
$ aptitude search magick++ | awk '/^i/'
i imagemagick - image manipulation programs
i A libgraphicsmagick++1 - format-independent image processing -
C++
i libgraphicsmagick++1-dev - format-independent image processing -
C++
i A libgraphicsmagick1 - format-independent image processing -
C sh
i A libgraphicsmagick1-dev - format-independent image processing -
C de
i libmagick++10 - C++ API to the ImageMagick library
i libmagick++9-dev - C++ API to the ImageMagick library -
devel
i A libmagick10 - image manipulation library
i libmagick9 - Image manipulation library
i A libmagick9-dev - image manipulation library -
development f

Il semble que cela soit suffisant pour travailler.
Je me suis alors penché sur les options de GCC (-l, -L, -I,...) sans
résultat, malheureusement... La documentation GCC est très fournie et je
m'y perds un peu... Et j'ai besoin d'avancer assez vite.
J'ai tenté ça aussi, avec pas mal de variantes :
$ pkg-config --cflags --libs magick++
Package magick++ was not found in the pkg-config search path.
Perhaps you should add the directory containing `magick++.pc'
to the PKG_CONFIG_PATH environment variable
No package 'magick++' found
Mais sans résultat probant, comme on peut le voir...
J'ai un mal de chien à faire le correspondance entre les paquets debian et
le nom des bibliothèques.

Mes questions sont donc les suivantes :
- Comment faire facilement un bilan des bibliothèques installées sur le
système ?
- comment donner les bons arguments à GCC afin de pouvoir compiler l'exemple
et enfin mon programme ?

Merci pour votre aide et bon dimanche (ensoleillé j'espère !).

4 réponses

Avatar
Lucas Levrel
Le 17 octobre 2010, Valrik a écrit :

J'ai un mal de chien à faire le correspondance entre les paquets debian et
le nom des bibliothèques.

Mes questions sont donc les suivantes :
- Comment faire facilement un bilan des bibliothèques installées sur le
système ?



Cette question aurait plus sa place dans fr.comp.os.linux.configuration.
Il doit y avoir moyen de lister tous les fichiers d'un paquet avec
aptitude je suppose. Sinon, ls /usr/lib. Ou alors utilise locate.

- comment donner les bons arguments à GCC afin de pouvoir compiler l'exemple
et enfin mon programme ?



Si ton code nécessite libtoto.so, g++ code.cc -ltoto doit suffire.


--
LL
Avatar
Valrik
Lucas Levrel wrote:

Le 17 octobre 2010, Valrik a écrit :

J'ai un mal de chien à faire le correspondance entre les paquets debian
et le nom des bibliothèques.

Mes questions sont donc les suivantes :
- Comment faire facilement un bilan des bibliothèques installées sur le
système ?



Cette question aurait plus sa place dans fr.comp.os.linux.configuration.
Il doit y avoir moyen de lister tous les fichiers d'un paquet avec
aptitude je suppose. Sinon, ls /usr/lib. Ou alors utilise locate.



bonjour Lucas,
pour ce qui est des listages de fichiers (find, ls, etc..) , pas de souci,
je connais.
Par exemple,
$ dpkg -L libmagick++10 // listage de fichiers d'un paquetage .deb
me donne :
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/libmagick++10
/usr/share/doc/libmagick++10/copyright
/usr/share/doc/libmagick++10/changelog.Debian.gz
/usr/lib
/usr/lib/libMagick++.so.10.0.9
/usr/lib/libMagick++.so.10

- comment donner les bons arguments à GCC afin de pouvoir compiler
l'exemple et enfin mon programme ?



Si ton code nécessite libtoto.so, g++ code.cc -ltoto doit suffire.



J'ai due m'emmêler les pinceaux, car lorsque j'ai fait
$ g++ essai.cpp -lMagick++
Tout c'est bien passé ! Je pensais l'avoir déjà fait pourtant, mais j'ai
essayé tellement de choses ! Bref, merci pour le coup de main et je vais
lire la documentation de gcc pendant mes longues nuits d'hivers. ;-)

Par contre j'ai toujours le problème :
pkg-config --libs Magick++
Package Magick++ was not found in the pkg-config search path.
Perhaps you should add the directory containing `Magick++.pc'
to the PKG_CONFIG_PATH environment variable
No package 'Magick++' found

Je ne comprends toujours pas le correspondances entre nom de paquetages, nom
de fichiers contenus dans les paquetages et nom de bibliothèques...
Peut-être sur fr.comp.os.linux.configuration, mais on y cause surtout
configuration et administration, pas trop développement...
Mais, il doit y avoir, si ce n'est une norme, au moins un usage de nommage
afin de s'y retrouver et ne pas faire comme moi, c'est à dire par
tâtonnement.
Si quelqu'un à l'habitude de développer sur un plateforme linux...
Avatar
Lucas Levrel
Le 17 octobre 2010, Valrik a écrit :
Par contre j'ai toujours le problème :
pkg-config --libs Magick++
Package Magick++ was not found in the pkg-config search path.
Perhaps you should add the directory containing `Magick++.pc'
to the PKG_CONFIG_PATH environment variable
No package 'Magick++' found



Le fichier Magick++.pc existe-t-il ?

Je ne comprends toujours pas le correspondances entre nom de paquetages, nom
de fichiers contenus dans les paquetages et nom de bibliothèques...
Peut-être sur fr.comp.os.linux.configuration, mais on y cause surtout
configuration et administration, pas trop développement...



Moi je trouve que c'est de l'administration, mais bon...

--
LL
Avatar
Valrik
Lucas Levrel wrote:

Le 17 octobre 2010, Valrik a écrit :
Par contre j'ai toujours le problème :
pkg-config --libs Magick++
Package Magick++ was not found in the pkg-config search path.
Perhaps you should add the directory containing `Magick++.pc'
to the PKG_CONFIG_PATH environment variable
No package 'Magick++' found



Le fichier Magick++.pc existe-t-il ?

Je ne comprends toujours pas le correspondances entre nom de paquetages,
nom de fichiers contenus dans les paquetages et nom de bibliothèques...
Peut-être sur fr.comp.os.linux.configuration, mais on y cause surtout
configuration et administration, pas trop développement...



Moi je trouve que c'est de l'administration, mais bon...



Oui, le sujet est aux confins des deux groupes.
Bon, j'ai avancé... ;-))
En lisant http://people.freedesktop.org/~dbn/pkg-config-guide.html j'ai
compris que pour chaque bibliothèque il y a un fichier de configuration
pkg-config dont l'extension est ".pc".
Un petit $ find /usr/ -name "*.pc" -type f | more et quelques secondes plus
tard je trouver un répertoire où il y en a des tas : /usr/lib/pkgconfig/.
Il y en a aussi quelques uns dans /usr/share, mais il ne semble pas qu'ils
concernent à proprement parlé des bibliothèques. En tous cas, il en existe
un qui s'appelle /usr/lib/pkgconfig/ImageMagick++.pc.
Donc, lorsque je fais :$ pkg-config --libs --cflags ImageMagick++
cela me retourne...
-lMagick++ -lWand -lMagick
Puissant !
Est ensuite, encore plus osé...
$ g++ essai_magick++.cpp $(pkg-config --libs --cflags ImageMagick++) -o
essai_magick // Pas d'erreur !
$ ls -l essai_magick*
-rwxr-xr-x 1 didier didier 8693 oct 17 22:39 essai_magick
-rw-r--r-- 1 didier didier 305 oct 17 18:48 essai_magick++.cpp
$
Conclusion : en fouinant dans le /usr/lib/pkgconfig/ je devrais trouver mon
bonheur à coup sûr !
Merci pour le coup de main.