2012-03-16 3 views
1

Oracle에 연결하기 위해 DBI 모듈을 사용하려면 LD_LIBRARY_PATH에 /oracle/v10.2.0/lib를 추가해야합니다.BEGIN 블록의 LD_LIBRARY_PATH 초기화가 실패합니다.

perl 스크립트를 실행하기 전에 쉘에서 LD_LIBRARY_PATH를 설정하면 모든 것이 정상입니다.

그러나이 스크립트에서 작동하지 않습니다

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을 참조하십시오

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

내가 오류를 얻을 스크립트를 실행

.

+1

Exec이 올바른 방법이지만, 거기에 끝없는 반복을 할 수 있다고 생각합니다. 꼬리 조건이 없으므로 올바른 경로가'$ ENV {LD_LIBRARY_PATH} '에없는 경우에만 exec해야합니다. exec와 함께 – Axeman

+0

이 작동합니다. 감사합니다. 유일한 문제는 perl 디버거 ("-d")가 더 이상 작동하지 않는다는 것입니다. exec는 곧바로 스크립트를 실행합니다 –

+0

Greg Dan- 환영합니다. –

0

또는 그와 비슷한 값으로 LD_LIBRARY_PATH을 설정하는 것이 좋습니다. ELF 로더가 시작될 때 가시적이어야합니다. /usr/bin/perl이 실행되기 전에 심지어는 BEGIN 스크립트 블록을 제외하고는 waaay입니다. exec() 트릭은 경로를 추가해야하는 경우 전체 바이너리를 다시 시작하지만 항상 사용자 환경에 항상 존재하는 것이 더 좋습니다.