Undefined reference to <nom-fonction>

Bonjour,

J'ai un problème lors de l'installation d'un package (le make) il me dit:
/usr/local/lib/libcomLib.so: undefined reference to 'posterFind
/usr/local/lib/libcomLib.so: undefined reference to 'posterDelete

et je ne sais pas ou est ce qu'il utilise libcomLib.so, j'ai parcouru le Makefile mais je n'ai rien trouvé!

Quelqu'un peut-il avoir une idée, please?
Merci d'avance!

24 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Qu'est ce que tu compiles et avec quelle distribution linux ?

    En gros ce que tu compiles fait appel à des fonctions (posterFind...) déclarées, mais qui devraient être fournies par des librairies (fichiers .so) qui sont absent de ton système. Du coup la compilation plante.

    Dans le Makefile, la référence à libcomLib est faite avec l'option -lcomLib, mais si elle est référencée, c'est qu'elle est utile donc ne modifie pas le makefile !

    A priori avant de compiler, tu es sensé lancer ./configure pour vérifier que tout ce qui est nécessaire à la compilation est correctement installé. Concrètement si le ./configure échoue, c'est que tu dois installer d'autres choses au préalable. Si le ./configure passe, mais pas la compilation, c'est qu'il y a une erreur dans les sources que tu compiles (ou dans son Makefile), mais c'est peu probable.

    Plus de détails sur la compilation ici :
    http://www.mistra.fr/tutoriel-linux-compiler.html

    Mais garde à l'esprit que sous linux, c'est ultra exceptionnel qu'on compile quelque chose à la main : on essaye en priorité d'installer la librairie ou le logiciel en question via le gestionnaire de paquets.

    Bonne chance
    1. Bonjour,

      Merci d'avoir pris le temps de voir et de répondre à ma question mamiemando.
      Je suis sous Ubuntu 11.10 et je compile le package tclserv se trouvant dans robotpkg.

      J'ai trouvé la solution à mon problème: Il y avait 2 versions de libtool (j'ai vu dans le build.log que les erreurs venaient après avoir fait appel à libtool) installées (1 ancienne 1.5.3 dans le système et une autre 2.2.6b (la plus à jour) dans le dossier robotpkg) donc ça a créé une confusion d'ou le problème, en fin je crois. Parce que dés que j'ai désinstallé les deux versions et réinstallé la plus à jour dans le système ça a marché (la compilation avait réussie)

      Maintenant un autre problème est survenu. Lors de l'installation de eltclsh l'erreur suivante apparait: cheking for tk libraby ....... nor found
      alors que les libtcl et libtk sont presents dans le pc (/usr/ local/lib)
      le make trouve libtcl le plus normalement possible (checking for tcl library... -L/usr/local/lib -ltcl8.5) mais pas le tk qui est dans le même repertoire. Pourquoi?

      Quelqu'un a t-il une idée?
      Merci
      1. Modérateur
        Le truc c'est que libtool, libtcl et libtk sont disponibles via les paquets, donc il faut éviter de les compiler à la main (car c'est galère, ce ne sera pas mis à jour etc...).

        De manière générale, tu dois en priorité installer ces librairies via les paquets (suffixés "-dev" si c'est pour compiler, et généralement préfixés "lib").

        Tu peux retrouver avec apt-cache et apt-file les bons paquets :
        http://www.mistra.fr/tutoriel-linux-apt.html#h2-rechercheanbsp-dans-les-paquets

        Pour installer apt-file :

        sudo apt-get update 
        sudo apt-get upgrade 
        sudo apt-get install apt-file 
        sudo apt-file update 


        On fait quelques recherches :

        apt-cache search libtool | grep libtool 
        apt-file search libtk | grep ".so$" 
        apt-file search libtcl | grep ".so$"


        ... pour en déduire quoi installer :

        sudo apt-get install libtool tcl-dev tk-dev


        Bonne chance
        1. Merci

          J'ai essayé de les installer automatiquement mais le problème persiste
          ( tk library not found alors qu'elle est dans /usr/local/lib )
          Que faire?
          1. Modérateur
            Normalement elle ne devrait plus être dans /usr/local/lib. Tu es sensé l'avoir déjà dans /usr/lib si tu as correctement installé le paquet.

            Lance :

            sudo updatedb


            Et reporte-moi le résultat de :

            locate libtk | grep ".so$"


            Bonne chance
            1. Bonjour,

              Le résultat de la commande locate libtk | grep ".so$" est:

              /home/sya/Bureau/openrobots/lib/libtk8.5.so
              /home/sya/Documents/Doc_/stages/Genom/Packages/tk8.5.10/unix/libtk8.5.so
              /home/sya/Documents/Doc_/Stages/Genom/Packages/tk8.5.10/unix/build/libtk8.5.so
              /home/sya/Documents/openrobot/lib/libtk8.5.so
              /home/sya/Documents/openrobots/lib/libtk8.5.so
              /usr/lib/libtk.so
              /usr/lib/libtk8.5.so
              /usr/lib/libreoffice/basis3.4/program/libtkli.so
              /usr/local/lib/libtk8.5.so
              1. Modérateur
                Ben tu vois bien que libtk est encore dans /usr/local/lib alors qu'il devrait être uniquement dans /usr/lib. Je ne pense pas que ce qu'y est dans ~/Documents interfère sauf mais en tout cas :

                /home/sya/Documents/openrobot/lib/libtk8.5.so
                /home/sya/Documents/openrobots/lib/libtk8.5.so 


                ... n'ont pas lieu d'être non plus.

                Bonne chance
                1. Modérateur
                  Peux-tu me donner le lien vers les sources que tu cherches à compiler (il y a plusieurs trucs qui s'appellent openrobot) ?
                  1. Bonjour,

                    Je m'excuse pour le retard j'avais un problème de connexion.
                    Bon. Le package s'appelle eltclsh-1.12.tar.gz, et en essayant de le compiler il vous sortira l'erreur de dépendance (tcl/tk 8.5 non trouvé), enfin c'est ce qui s'est passé dans mon cas!
                    1. Salut

                      As-tu regardé le fichier "config.log" créé automatiquement pendant
                      la configuration d'une source ?

                      Peut-être qu'une nouvelle création de "configure" pourrait corriger ce problème en utilisant "autogen.sh" qui se trouve dans ton archive "eltclsh".
                      1. Ok.
                        As-tu regardé dans "config.log" pour "cheking for tk libraby ....... nor found" ?
                        Normalement,les détails de cette erreur sont indiqués dans ce fichier.
                        1. J'ai essayé "eltclsh"(avec Slackware) et tk est trouvé sans problème

                          As-tu essayé:
                          ./configure LDFLAGS="-L/usr/local/lib" CPPFLAGS="-I/usr/local/include"

                          ou

                          ./configure CFLAGS="-L/usr/local/lib -I/usr/local/include" 
                          
                          1. Bonjour,

                            J'ai essayé les deux commandes indiquées et ça n'a pas marché!
                            Alors j'ai parcouru le fichier config.log et voila ce que j'ai trouvé:

                            "configure: 11505: checking for tk library
                            configure: 11528: /usr/bin/gcc -o conftest -03 -DNDEBUG -I/usr/local/include -I/usr/local/include conftest.c -L/usr/local/lib -ltk8.5 -R/usr/local/lib -L/usr/local/lib -ltcl8.5 >&5
                            gcc: error: unrecognized option '-R' "

                            donc, j'ai ouvert le fichier configure dans la ligne indiquée et au lieu de :
                            LIBS="${LIBS} ${TK_LIB_SPEC} ${TCL_LIB_SPEC}" j'ai mis
                            LIBS="${LIBS} ${TK_LIB_SPEC} " et ça a marché, eltclsh s'est installé.

                            Mais (il y a apparemment toujours un mais) lorsque je lance eltclsh il se lance oui mais avec une erreur:
                            $eltclsh
                            Cannot read termcap database;
                            using dumb terminal settings.

                            eltclsh1.12 - Copyright (C) 2001-2011 LAAS-CNRS

                            eltclsh >

                            Voila! quelqu'un a t-il une idée?
                            1. "curses/termcap" est peut-être manquant. Il faut regarder du côté de ncurses avec ncurses-base,ncurses-bin,ncurses-term,libncurses5 ou libncurses5-dev.
                              1. J'ai essayé de les installer, mais ils sont déjà presents dans mon pc avec une version la plus à jour (sauf pour ncurses-term qui n'y était pas, je l'ai installé mais rien n'a changé)
                                1. Normalement, dans "eltclsh","configure" vérifie la présence de "libtermcap".
                                  1. Bon. Je n'ai trouvé qu'une seule occurrence de termcap et pas de libtermcap.

                                    for ac_lib in '' termcap ncurses; do
                                      if test -z "$ac_lib"; then
                                        ac_res="none required"
                                      else
                                        ac_res=-l$ac_lib
                                        LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
                                      fi
                                      if ac_fn_c_try_link "$LINENO"; then :
                                      ac_cv_search_tputs=$ac_res
                                    fi
                                    rm -f core conftest.err conftest.$ac_objext \
                                        conftest$ac_exeext
                                      if test "${ac_cv_search_tputs+set}" = set; then :
                                      break
                                    fi
                                    done
                                    


                                    J'ai réecrit toute la boucle contenant termcap, je ne sais pas si elle y était avant d'installer ncurses-term parce que le problème persiste!
                                    • 1
                                    • 2