LD_LIBRARY_PATH
miljövariabel måste ställas in före ditt program startar — före perl
själv är laddad. Ändra det i BEGIN{}
kommer att påverka nya program som du startar, men det påverkar inte laddningen av delade bibliotek — i det här fallet (även om jag aldrig har använt DBD::Oracle) laddar du en Oracle .so
i det program som redan körs, så det är "för sent" att ändra LD_LIBRARY_PATH
. Den dynamiska länken /lib/ld.so
(eller så) startas före perl
, så när ditt skript är kompilerat och BEGIN{}
körs, den är redan konfigurerad.
Du kunde försök att köra om ditt skript som sin egen efterträdare eller något*, men ett kort skalskript kommer nästan säkert att vara den enklaste lösningen:
#!/bin/sh
export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client64/lib
export ORACLE_SID=prod
exec /usr/local/bin/your-db-program "[email protected]"
*- det här skulle vara lite galet, men TIMTOWTDI:
eval {
use DBD::Oracle foo bar baz; …
};
if ([email protected] =~ /install_driver\(Oracle\) failed/) {
$ENV{LD_LIBRARY_PATH} .= ':/usr/lib/oracle/10.2.0.3/client64/lib';
$ENV{ORACLE_SID} = 'prod';
warn "Restarting with LD_LIBRARY_PATH reset:\n\[email protected]\n";
exec { $0 } $0 => @ARGV;
}