第2章:安装MySQL / 2.13. Perl安装注意事项 / 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.somake的输出)-L选项应指定libgcc.a在系统中的安装目录的路径名。

该问题的另一个原因是PerlMySQL没有用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

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

如果你想要在不支持动态链接(例如 SCO)的系统中使用Perl模块,可以生成一个包括DBIDBD::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

然后必须安装新的Perlmake 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

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