инициализация LD_LIBRARY_PATH в блоке BEGIN завершается неудачно - PullRequest
1 голос
/ 16 марта 2012

Мне нужно добавить /oracle/v10.2.0/lib в LD_LIBRARY_PATH, чтобы использовать модуль DBI для подключения к Oracle.

Если я установлю LD_LIBRARY_PATH в оболочке перед выполнением сценария perl, все в порядке.

Но он не работает из скрипта:

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

Когда я запускаю скрипт, я получаю сообщение об ошибке:

install_driver (Oracle) не удалось: Не удается загрузить '/usr/apps/perl5/site_perl/5.8.8/i686-linux/auto/DBD/Oracle/Oracle.so 'для модуля DBD :: Oracle: libclntsh.so.10.1: невозможно открыть файл общего объекта: такого файла нет иликаталог в /usr/apps/perl5/5.8.8/i686-linux/DynaLoader.pm строка 230. в строке (eval 3) 3 Не удалось выполнить компиляцию в строке require в (eval 3) 3. Возможно, требуется общая библиотека или dllне установлен там, где ожидается, в /var/tmp/getTraceDB.pl строка 23

Ответы [ 2 ]

5 голосов
/ 16 марта 2012
BEGIN {
$ENV{'LD_LIBRARY_PATH'}.='/oracle/v10.2.0/lib';
exec($^X, $0, @ARGV);
}
use DBI;

См. Среда выполнения и LD_LIBRARY_PATH для правильного описания.

0 голосов
/ 19 марта 2012

Намного лучше было бы установить LD_LIBRARY_PATH в вашем .profile или подобном.Он должен быть виден во время запуска загрузчика ELF, что является ожиданием до запуска даже /usr/bin/perl, не говоря уже о блоке BEGIN вашего скрипта.Трюк exec() работает путем перезапуска всего двоичного файла, если ему нужно добавить путь, но лучше было бы, чтобы он всегда существовал в вашей среде всегда.

...