BEGIN块中LD_LIBRARY_PATH的初始化失败

时间:2012-03-16 10:09:16

标签: perl oracle dbi dbd

我必须将/oracle/v10.2.0/lib添加到LD_LIBRARY_PATH以使用DBI模块连接到Oracle。

如果我在执行perl脚本之前在shell中设置LD_LIBRARY_PATH,一切正常。

但它不适用于脚本:

BEGIN {
  $ENV{'LD_LIBRARY_PATH'}='/oracle/v10.2.0/lib';
}
use DBI;

当我执行脚本时,我收到错误:

  

install_driver(Oracle)失败:无法为模块DBD :: Oracle:libclntsh加载'/usr/apps/perl5/site_perl/5.8.8/i686-linux/auto/DBD/Oracle/Oracle.so'。 so.10.1:无法打开共享对象文件:/usr/apps/perl5/5.8.8/i686-linux/DynaLoader.pm第230行没有这样的文件或目录。    在(评估3)第3行   在(eval 3)第3行的require中编译失败。   可能未在预期的位置安装所需的共享库或dll    在/var/tmp/getTraceDB.pl第23行

2 个答案:

答案 0 :(得分:5)

BEGIN {
$ENV{'LD_LIBRARY_PATH'}.='/oracle/v10.2.0/lib';
exec($^X, $0, @ARGV);
}
use DBI;

请参阅Runtime Linker and LD_LIBRARY_PATH以获取正确的说明。

答案 1 :(得分:0)

更好的方法是在LD_LIBRARY_PATH或类似内容设置.profile。它必须在ELF加载器启动时可见,即使在/usr/bin/perl运行之前也是如此,更不用说脚本的BEGIN块了。如果必须添加路径,则exec()技巧可以通过重新启动整个二进制文件来实现,但更好的方法是始终在您的环境中始终存在。