%ENV 不起作用,我无法使用共享库

2023-11-21

我无法使用%ENV在我的 Perl 脚本上使用 var 来使用 Oracle 库。

BEGIN {
    $ORACLE_HOME = "/usr/lib/oracle/10.2.0.3/client64";
    $LD_LIBRARY_PATH = "$ORACLE_HOME/lib";
    $ORACLE_SID="prod";
    $ENV{ORACLE_SID}=$ORACLE_SID;
    $ENV{ORACLE_HOME}= $ORACLE_HOME;
    $ENV{LD_LIBRARY_PATH}= $LD_LIBRARY_PATH;
};

如果我打印$ENV{'ORACLE_HOME'} and $ENV{'LD_LIBRARY_PATH'}一切看起来都不错,但是当我运行脚本时出现错误:

install_driver(Oracle) 失败:无法加载模块 DBD::Oracle 的“/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so”:libclntsh.so.10.1:无法打开共享对象文件:否此类文件或目录位于 /usr/lib64/perl5/DynaLoader.pm 第 200 行。 在 (eval 3) 第 3 行 (eval 3) 第 3 行的 require 编译失败。 也许所需的共享库或 dll 没有安装在预期的位置 在 persistence.perl 第 22 行

在网上搜索我发现在 Perl 上设置环境变量的正确方法是使用%ENV hash.

出口ORACLE_HOME and LD_LIBRARY_PATH通过 Unix shell (export LD_LIBRARY_PATH=...)它工作正常。有什么建议吗?


The LD_LIBRARY_PATH必须设置环境变量before你的程序开始之前perl本身已加载。将其更改为BEGIN{}会影响新的programs你启动,但不会影响加载共享库— 在本例中(尽管我从未使用过 DBD::Oracle),您正在加载 Oracle.so进入已经运行的程序,所以改变它“太晚了”LD_LIBRARY_PATH。动态链接器/lib/ld.so(或如此)之前开始perl,所以当你的脚本被编译时BEGIN{}运行,已经设置好了。

You could尝试重新执行你的脚本作为它自己的后继者或其他东西*,但是一个简短的 shell 脚本几乎肯定是最简单的解决方案:

  #!/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 "$@"

*- 这有点疯狂,但是 TIMTOWTDI:

  eval { 
     use DBD::Oracle foo bar baz; …
  };
  if ($@ =~ /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\n$@\n";
     exec { $0 } $0 => @ARGV;
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

%ENV 不起作用,我无法使用共享库 的相关文章

随机推荐