如何在FreeBSD上使用gethostbyname_r和DBI或DBD :: MySQL解决这个问题?

时间:2008-12-27 20:56:33

标签: mysql perl dbi freebsd

我有一些旧的perl代码,最近停止在FreeBSD框上工作。失败的代码看起来(最简单的形式)如下:

#!/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”,则代码会成功。

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

此服务器上的其他应用程序(PHP,命令行工具)可以通过主机名轻松访问mysql数据库。

有关如何解决此问题的建议?

已编辑添加:我注意到我的方框同时包含libmysqlclient.so.15libmysqlclient_r.so.15。可能问题是DBD :: mysql在使用libmysqlclient_r时是否正在尝试使用libmysqlclient?如果是这样,如何解决?

6 个答案:

答案 0 :(得分:2)

在黑暗中拍摄:

gethostbyname _r 表示Perl使用解析器代码的“可重入”(也称为线程/多线程)版本。似乎有些不对劲。

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

如果安装了二进制包,可能会在某处出现版本不匹配。

答案 1 :(得分:1)

'gethostbyname_r'是GNU扩展,不属于POSIX标准。 然而,在我的Freebsd 7盒子上,我的libc包含它:

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

你的libc是否包含这个符号?

答案 2 :(得分:1)

您的操作系统版本的libmysqlclient版本已过期。因为它在/ usr / local中,我认为它是从源代码编译而不是安装的。您可以通过重新编译来修复它,但您可能想看看是否有可以通过您的OSes包管理器安装的受支持的mysql版本。

答案 3 :(得分:1)

尝试暂时移动/usr/local/lib/mysql/libmysqlclient.so.15/usr/local/lib/mysql/libmysqlclient.a(重命名或其他内容)后,尝试从端口重新安装DBD-mysql。这可能会强制DBD-mysql与libmysqlclient_r链接。

答案 4 :(得分:1)

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

答案 5 :(得分: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-client,重新安装没有帮助解决问题;(

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)