ITEEDU

2.13.3. 使用Perl DBI/DBD接口的问题

如果Perl报告它不能发现../mysql/mysql.so模块,可能试因为Perl不能定位共享库libmysqlclient.so。

可以使用下面的方法修复该问题:

·         用perl Makefile.PL -static -config而不要用perl Makefile.PL编译DBD::mysql分发版。

·         将libmysqlclient.so复制到其它共享库所在的目录 (可能为/usr/lib 或/lib)。

·         修改用来编译DBD::mysql的-L选项,反应libmysqlclient.so的实际位置。

·         在Linux中,你可以将libmysqlclient.so的目录路径名增加到/etc/ld.so.conf文件。

·         将libmysqlclient.so的目录路径名增加到LD_RUN_PATH环境变量。一些系统使用LD_LIBRARY_PATH。

注意如果连接器没有找到另一个库,你还可能需要修改-L选项。例如,如果因为libc在/lib下并且连接命令指定了-L/usr/lib,连接器不能找到它,将-L选项更改为-L/lib或在连接命令中增加-L/lib。

如果你遇到下面的DBD::mysql错误,你可能使用了gcc(或使用了用gcc编译的旧的二进制):

/usr/bin/perl: can't resolve symbol '__moddi3'
/usr/bin/perl: can't resolve symbol '__divdi3'

当构建mysql.so库是在连接命令中增加-L/usr/lib/gcc-lib/... -lgcc(当编译Perl客户端时检查生成mysql.so的make的输出)。-L选项应指定libgcc.a在系统中的安装目录的路径名。

该问题的另一个原因是Perl和MySQL没有用gcc编译。在这种情况下,你可以用gcc编译二者来解决。

当你运行测试时你会从DBD::mysql看见下面的错误:

t/00base............install_driver(mysql) failed:
Can't load '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql:
../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol:
uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169.

这意味着你需要在连接行包括-lz 压缩库。可以通过更改文件lib/DBD/mysql/Install.pm的下列行来实现:

$sysliblist .= " -lm";

更改为:

$sysliblist .= " -lm -lz";

然后,你必须运行make realclean 然后重新安装。

如果你想要在SCO上安装DBI,需要在DBI-xxx 和每个子目录中编辑Makefile。请注意下面的更新假定使用gcc 2.95.2或更新版:

旧:                                 新:
CC = cc                               CC = gcc
CCCDLFLAGS = -KPIC -W1,-Bexport       CCCDLFLAGS = -fpic
CCDLFLAGS = -wl,-Bexport              CCDLFLAGS =
 
LD = ld                               LD = gcc -G -fpic
LDDLFLAGS = -G -L/usr/local/lib       LDDLFLAGS = -L/usr/local/lib
LDFLAGS = -belf -L/usr/local/lib      LDFLAGS = -L/usr/local/lib
 
LD = ld                               LD = gcc -G -fpic
OPTIMISE = -Od                        OPTIMISE = -O1
 
旧:
CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include
 
新:
CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include

这些更改是必需的,因为用icc或cc编译的Perl动态装载器不装载DBI模块。

如果你想要在不支持动态链接(例如 SCO)的系统中使用Perl模块,可以生成一个包括DBI和DBD::mysql的静态版本的Perl。方法是生成一个用DBI代码连接的Perl版本,并将它安装到当前Perl的顶级目录。然后构建一个含DBD代码连接的Perl版本并安装。

在SCO中,必须将下面的环境变量设置为:

LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib

Or:

LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\
    /usr/progressive/lib:/usr/skunk/lib
LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\
    /usr/progressive/lib:/usr/skunk/lib
MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:\
    /usr/skunk/man:

首先,在DBD分发版的安装目录运行下述命令来创建一个包括静态连接的DBD模块的Perl:

shell> perl Makefile.PL -static -config
shell> make
shell> make install
shell> make perl

然后必须安装新的Perl。make perl的输出表示安装时需要执行的make命令。在SCO中,为make -f Makefile.aperl inst_perl MAP_TARGET=perl。

然后,使用刚刚创建的Perl,在DBD::mysql分发版的安装目录运行下述命令来创建另一个Perl,应包括静态连接的DBD::mysql:

shell> perl Makefile.PL -static -config
shell> make
shell> make install
shell> make perl

最后,应当安装新的Perl。make perl的输出指示了使用的命令。


这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com.。原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。