我有一些旧的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.15
和libmysqlclient_r.so.15
。可能问题是DBD :: mysql在使用libmysqlclient_r时是否正在尝试使用libmysqlclient?如果是这样,如何解决?
答案 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,重新安装没有帮助解决问题;(
但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)