14 votes

Une autre erreur de type "référence non définie" lors de l'établissement de liens entre les bibliothèques de boost

J'ai vu plusieurs autres messages qui traitent exactement du même problème. Cependant, aucune de leurs solutions ne semble fonctionner pour moi. Je compile le code suivant :

#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/timer/timer.hpp>

using namespace boost::numeric::ublas;

int main(){    
   matrix<double> mat1 (3,3);
   matrix<double> mat2 (3,3);
   matrix<double> mat3 (3,3);

   unsigned k=0;

   for(unsigned i = 0; i < mat1.size1(); ++i){
      for(unsigned j = 0; j < mat1.size2(); ++j){
         mat1(i,j) = k;
         mat2(i,j) = 2*k++;
      }   
   }   

   k=0;
   if(1){
      boost::timer::auto_cpu_timer t;
      while(k<1000){
         mat3 = prod(mat1,mat2);
         k++;
      }   
   }   
   return 0;
}

Je compile à partir de la ligne de commande en utilisant :

$ g++ matrix_test.cpp -o matrix_test -lboost_system -lboost_timer

et reçoit l'erreur suivante :

usr/lib/gcc/i686-redhat-linux/4.7.0/../../../libboost_timer.so : référence indéfinie à `boost::chrono::steady_clock::now()'.
collect2 : error : ld a retourné un statut de sortie 1

Si j'ajoute -lboost_chrono lors de la compilation, j'obtiens cette erreur :

/usr/lib/gcc/i686-redhat-linux/4.7.0/../../../libboost_chrono.so : référence indéfinie à `clock_gettime'.
collect2 : error : ld a retourné un statut de sortie 1

Je peux tracer clock_gettime jusqu'à sys/time.h. Malheureusement, je ne trouve pas de fichier .so correspondant auquel me lier. Qu'est-ce que je manque ici ?

22voto

Olaf Dietsche Points 35264

Vous devez ajouter -lrt à vos bibliothèques de liens

g++ matrix_test.cpp -o matrix_test -lboost_system -lboost_timer -lboost_chrono -lrt

Mise à jour (2016-08-31)

Cela semble toujours être un problème. Lorsque vous recherchez man clock_gettime ce qui conduit à la solution ( -lrt ), mais il est également dit

Lier avec -lrt (seulement pour les versions de la glibc avant 2.17).

Donc si votre glibc est plus récente, votre problème peut être autre.

9voto

ildjarn Points 38377

Ajouter -lrt à votre invocation de g++ - clock_gettime est en librt.so .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X