我必须将/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行
答案 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()
技巧可以通过重新启动整个二进制文件来实现,但更好的方法是始终在您的环境中始终存在。