2017-08-24 2 views
0

Je suis en train de compiler gobby, et la compilation des arrêts avec ces erreurs:question g ++ et glibmm

/usr/lib64/gcc/x86_64-slackware-linux/4.9.3/../../../../lib64/libglibmm-2.4.so: undefined reference to `std::out_of_range::out_of_range(char const*)@GLIBCXX_3.4.21' 
/usr/lib64/gcc/x86_64-slackware-linux/4.9.3/../../../../lib64/libglibmm-2.4.so: undefined reference to `std::underflow_error::underflow_error(char const*)@GLIBCXX_3.4.21' 
/usr/lib64/gcc/x86_64-slackware-linux/4.9.3/../../../../lib64/libglibmm-2.4.so: undefined reference to `std::overflow_error::overflow_error(char const*)@GLIBCXX_3.4.21' 

Première réaction vérifiait la commande de liaison. Il se termine comme ceci:

... -lgsasl -lgnutls -lgtkmm-3.0 -latkmm-1.6 -lgdkmm-3.0 -lgiomm-2.4 -lpangomm-1.4 **-lglibmm-2.4** -lcairomm-1.0 -lsigc-2.0 -lgtksourceview-3.0 -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -linfgtk-0.7 -linftextgtk-0.7 -linftext-0.7 -linfinity-0.7 -lxml2 -lgnutls -lgsasl -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 

(j'ai marqué la bibliothèque -lglibmm-2.4 avec ** Je pense que ce dont les identifiants doivent être définis pour être sûr que je courais..

$ objdump -TC libglibmm-2.4.so.1.3.0 | grep out_of_range 
0000000000000000  DF *UND* 0000000000000000 GLIBCXX_3.4.21 std::out_of_range::out_of_range(char const*) 
0000000000000000  DF *UND* 0000000000000000 GLIBCXX_3.4 std::out_of_range::~out_of_range() 
0000000000000000  DF *UND* 0000000000000000 GLIBCXX_3.4.20 std::__throw_out_of_range_fmt(char const*, ...) 
0000000000000000  DO *UND* 0000000000000000 GLIBCXX_3.4 typeinfo for std::out_of_range 

$ objdump -TC libglibmm-2.4.so.1.3.0 | grep overflow_error 
0000000000000000  DF *UND* 0000000000000000 GLIBCXX_3.4.21 std::overflow_error::overflow_error(char const*) 
0000000000000000  DF *UND* 0000000000000000 GLIBCXX_3.4 std::overflow_error::~overflow_error() 
0000000000000000  DO *UND* 0000000000000000 GLIBCXX_3.4 typeinfo for std::overflow_error 

Ainsi, ils semblent être . non définie dans le fichier .so Où doivent-ils être définis puis

+0

@RinatVeliakhmedov, je viens de lancer ./configure et make - aucune modification n'a été apportée aux originaux du tar.gz – jcoppens

+0

es-tu lié à quelque chose de pré-construit pour une plate-forme différente? C'est quand j'ai vu des problèmes comme ça avant. – xaxxon

+0

@xaxxon, vous ne savez pas ce que vous demandez - une compilation croisée? Tout est "natif", je compile sur x86_64, et c'est aussi la destination. – jcoppens

Répondre

0

Eh bien, je résolu la question de la compilation, mais cela crée une autre question:

 19 Aug 23 21:39 libstdc++.so  -> libstdc++.so.6.0.20 
    18 Sep 3 2016 libstdc++.so.5  -> libstdc++.so.5.0.7 
4515618 Jun 5 2013 libstdc++.so.5.0.7 
    19 Sep 3 2016 libstdc++.so.6  -> libstdc++.so.6.0.21 
966848 Jul 30 2012 libstdc++.so.6.0.17 
1003520 Aug 19 2015 libstdc++.so.6.0.20 
1533144 Mar 7 2016 libstdc++.so.6.0.21 

Après avoir updatedl libstdc++ ya peu de temps, la version est passée de 6.0.20 à 6.0.21, même après avoir appelé manuellement ldconfig, libstdc++.so encore pointé la version 6.0.20. Changer ce lien manuellement à 6.0.21 a résolu le problème.

J'avais l'impression que ldconfig aurait dû prendre soin de cela. Ni la page de manuel, ni une recherche n'a révélé l'algorithme exact ldconfig suit ... Suis-je mauvais ici?

+0

Non, 'ldconfig' ne se soucie pas de ce lien. 'ldconfig' se soucie de l'exécution, c'est-à-dire de localiser les bibliothèques correctes lorsqu'un programme est exécuté. Le lien de 'libstdC++. So' est uniquement pertinent pour _link time_ (lorsque votre éditeur de liens produit le programme après la compilation), mais pas pour runtime. –