2012-03-16 6 views
1

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

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

Но он не работает из сценария:

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

Когда я выполнить сценарий, я получаю ошибку:

install_driver(Oracle) failed: Can't load '/usr/apps/perl5/site_perl/5.8.8/i686-linux/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.10.1: cannot open shared object file: No such file or directory at /usr/apps/perl5/5.8.8/i686-linux/DynaLoader.pm line 230. at (eval 3) line 3 Compilation failed in require at (eval 3) line 3. Perhaps a required shared library or dll isn't installed where expected at /var/tmp/getTraceDB.pl line 23

ответ

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

Runtime Linker and LD_LIBRARY_PATH Приведи для правильного описания.

+1

Exec - это правильный путь, но я думаю, вы попали в бесконечный цикл. Вы должны выполнять только тогда, когда правильный путь еще не был в '$ ENV {LD_LIBRARY_PATH}', потому что нет условия хвоста. – Axeman

+0

с exec он работает, спасибо. Единственная проблема заключается в том, что отладчик perl («-d») больше не работает ... exec запускает скрипт сразу –

+0

Greg Dan- Welcome. –

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^