2012-03-16 21 views
1

DBIモジュールを使用してOracleに接続するには、/oracle/v10.2.0/libをLD_LIBRARY_PATHに追加する必要があります。BEGINブロックでのLD_LIBRARY_PATHの初期化が失敗します

perlスクリプトを実行する前にシェルでLD_LIBRARY_PATHを設定すると、すべてがOKです。

しかし、それはスクリプトから動作しません:私は、スクリプトを実行すると

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} 'にないときだけexecするべきです。 execと一緒に – Axeman

+0

が動作しています。ありがとうございます。唯一の問題はperlデバッガ( "-d")がもう動かないということです。execはすぐにスクリプトを実行します –

+0

Greg Dan-ようこそ。 –

0

LD_LIBRARY_PATH.profileなどに設定した方が良いでしょう。 ELFローダーの起動時に可視でなければなりません。/usr/bin/perlが実行される前であっても、スクリプトのBEGINブロックだけでなく、waaayです。 exec()トリックは、パスを追加する必要がある場合はバイナリ全体を再起動しますが、常にその環境に常に存在する方が良いでしょう。

関連する問題