2008-12-27 50 views
2

我有一些旧的perl代码,最近停止在FreeBSD上工作。这样它看起来失败(以最简单的形式)的代码:如何在FreeBSD上用gethostbyname_r和DBI或DBD :: MySQL解决这个问题?

#!/usr/local/bin/perl -w 

use strict; 
use DBI; 

my $datasource = "DBI:mysql:dbname:hostname.domain.com"; 
my $user = "username"; 
my $pass = "password"; 

DBI->connect($datasource, $user, $pass); 

这失败,出现以下错误:

/libexec/ld-elf.so.1: /usr/local/lib/mysql/libmysqlclient.so.15: Undefined symbol "gethostbyname_r" 

如果我更改数据源引用“localhost”的代码成功。

我已经从ports重新安装了mysql-client,DBI和DBD-mysql;没有效果。

此服务器上的其他应用程序(PHP,命令行工具)能够通过主机名访问mysql数据库,没有麻烦。

如何解决此问题的建议?

编辑添加:我注意到我的箱子有libmysqlclient.so.15libmysqlclient_r.so.15。可能问题是DBD :: mysql在尝试使用libmysqlclient时应该使用libmysqlclient_r?如果是这样,如何解决?

回答

2

在黑暗中拍摄:

的gethostbyname _r指示Perl使用“折返”(也称为线程/多线程)解析器代码的版本。似乎有什么不对。

编译端口树中的依赖关系时,通常可以打开或关闭多线程。您可以从每个端口应用程序目录中用make config更改以前的选择。

如果您安装了二进制包,那么可能存在版本不匹配的情况。

+0

这听起来很有道理,但我没有看到任何相关端口上的可调选项 – davidcl 2008-12-27 21:12:59

+0

哦,我不使用二进制包 - 从源端口编译的所有东西 – davidcl 2008-12-27 21:15:37

+0

请参阅我的问题底部的编辑以获取可能的引导 – davidcl 2008-12-27 21:21:22

1

'gethostbyname_r'是一个GNU扩展,并不是POSIX标准的一部分。 然而,在我的FreeBSD 7中,我的libc中包含了它:

nm /usr/lib/libc.a | grep gethostbyname_r 
00000eb0 T gethostbyname_r 

贵的libc中包含这个符号?

+0

是: venture#nm /usr/lib/libc.a | gr ep gethostbyname_r 00000744 T gethostbyname_r – davidcl 2008-12-27 21:13:59

1

您的libmysqlclient版本针对您的操作系统版本过时。由于它位于/ usr/local,因此我认为它是从源代码编译而不是安装的。你可以通过重新编译来修复它,但是你可能想看看是否有可以通过你的OSes软件包管理器安装的支持的mysql版本。

1

尝试重新安装DBD-mysql临时移动/usr/local/lib/mysql/libmysqlclient.so.15/usr/local/lib/mysql/libmysqlclient.a(重命名它或某物)之后,再安装DBD-mysql。这可能会强制DBD-mysql与libmysqlclient_r链接。

1

作为一种解决方法,请尝试将hostname.domain.com添加到/ etc/hosts,或者在Perl代码中明确查找IP地址并使用该地址。

0
# ldd libmysqlclient.so.15 
libmysqlclient.so.15: 
     libcrypt.so.3 => /lib/libcrypt.so.3 (0x281bf000) 
     libm.so.4 => /lib/libm.so.4 (0x281d7000) 
     libz.so.3 => /lib/libz.so.3 (0x281ed000) 

FreeBSD 6。4-P3,MySQL的客户端从ports安装,重装不是有问题的帮助;(

在LDD输出中没有的libc(

但MySQL的正确编译:

# ldd mysql 
mysql: 
     libreadline.so.6 => /lib/libreadline.so.6 (0x28089000) 
     libncursesw.so.6 => /lib/libncursesw.so.6 (0x280b9000) 
     libmysqlclient.so.15 => /usr/local/lib/mysql/libmysqlclient.so.15 (0x28102000) 
     libcrypt.so.3 => /lib/libcrypt.so.3 (0x2815c000) 
     libz.so.3 => /lib/libz.so.3 (0x28174000) 
     libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x28185000) 
     libm.so.4 => /lib/libm.so.4 (0x28250000) 
     libc.so.6 => /lib/libc.so.6 (0x28266000) 
     libncurses.so.6 => /lib/libncurses.so.6 (0x2834d000)