1 votes

PERL+mysql : symbole indéfini : mysql_init

J'ai mis à jour mysql (client+serveur+dev) à partir des rpms disponibles sur mysql.com.

rpm -i MySQL-server-5.5.14-1.linux2.6.x86_64.rpm
rpm -i MySQL-client-5.5.14-1.linux2.6.x86_64.rpm
rpm -i MySQL-devel-5.5.14-1.linux2.6.x86_64.rpm

maintenant, un script qui se connectait à un autre serveur dit :

perl: symbol lookup error: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/DBD/mysql/mysql.so: undefined symbol: mysql_init

le script :

use DBI;

$dsn="db";
$host="my.host.ip";
$user="anonymous"; 
$password="";
# Connect to the database.
 $dbh= DBI->connect("DBI:mysql:host=$host;database=$dsn",$user, $password,{'RaiseError' => 1});

J'ai donc réinstallé DBI-1.616 et DBD-mysql-4.019 à partir des sources. pour DBD-mysql, Faire un test dit :

$ make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/00base....................ok 1/6                                           
#   Failed test 'use DBD::mysql;'
#   in t/00base.t at line 21.
#     Tried to use 'DBD::mysql'.
#     Error:  Can't load '/usr/local/package/DBD-mysql-4.019/blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql: /usr/local/package/DBD-mysql-4.019/blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: mysql_get_server_version at /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/DynaLoader.pm line 230.
#  at (eval 6) line 2
# Compilation failed in require at (eval 6) line 2.
# BEGIN failed--compilation aborted at t/00base.t line 21.
t/00base....................NOK 2FAILED--Further testing stopped: Unable to load DBD::mysql
make: *** [test_dynamic] Error 9

Comment puis-je résoudre ce problème ?

Merci !

1voto

iynque Points 875

OK, j'ai trouvé la solution. D'après ce que j'ai compris, la distribution mysql que j'ai utilisée est liée statiquement. Donc quand DB:mysql est installé, il doit être compilé avec ces bibliothèques statiques :

  mkdir /tmp/mysql-static
  cp /usr/lib64/mysql/*.a /tmp/mysql-static
  perl Makefile.PL --libs="-L/tmp/mysql-static -lmysqlclient"
  make
  make test
  make install
  rm -rf /tmp/mysql-static

0voto

Ryan Sampson Points 2898

Le fait que DBD-mysql ne puisse plus trouver le symbole mysql_get_server_version suggère que la bibliothèque client MySQL plus récente que vous avez installée ne possède probablement pas cette fonction particulière (ou l'a renommée, ou autre). Étant donné que vous ne fournissez pas d'informations sur ce vers quoi ou depuis quoi vous avez effectué la mise à niveau, il est difficile d'enquêter et de vous donner une réponse complète sur un plateau, mais je serais enclin à essayer une mise à niveau de DBD-mysql, sur la base qu'un changement d'API non rétro-compatible peut être impliqué, et qu'une version plus récente de DBD-mysql pourrait mieux le gérer.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X