2012-03-16 42 views
1

我必須將/oracle/v10.2.0/lib添加到LD_LIBRARY_PATH才能使用DBI模塊連接到Oracle。初始化BEGIN塊中的LD_LIBRARY_PATH失敗

如果我在執行perl腳本之前在shell中設置LD_LIBRARY_PATH,那麼一切正常。

但它不會從腳本工作:

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

執行是正確的方式,但我認爲你會讓自己陷入無盡的循環。只有當正確的路徑不在'$ ENV {LD_LIBRARY_PATH}'中時才應該執行,因爲沒有尾部條件。 – Axeman 2012-03-16 12:23:33

+0

與exec它工作,謝謝。唯一的問題是perl調試器(「-d」)不工作了...... exec立即執行腳本 – 2012-03-16 13:48:51

+0

Greg Dan-歡迎。 – 2012-03-17 05:46:22

0

更好的辦法是將LD_LIBRARY_PATH設置在您的.profile或類似中。它必須在ELF加載程序啓動時顯示,即使在運行/usr/bin/perl之前也是如此,更不用說腳本的BEGIN塊了。 exec()技巧是通過重新啓動整個二進制文件來實現的,如果它必須添加路徑的話,但更好的辦法是始終存在於您的環境中。