%ENV不工作,我不能使用共享库

编程入门 行业动态 更新时间:2024-10-28 03:30:17
本文介绍了%ENV不工作,我不能使用共享库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我不能在我的Perl脚本中使用%ENV var使用Oracle库。

I cannot use %ENV var on my Perl script to use Oracle libs.

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'} 和 $ ENV {'LD_LIBRARY_PATH'} 似乎都可以,但是当我运行我的脚本时,我有错误:

If I print $ENV{'ORACLE_HOME'} and $ENV{'LD_LIBRARY_PATH'} all seems ok but, when I run my script I have the error:

install_driver(Oracle)失败:无法为模块DBD :: Oracle加载'/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so':libclntsh.so .10.1:无法打开共享对象文件:在/usr/lib64/perl5/DynaLoader.pm行200.没有这样的文件或目录。 at(eval 3)行3 编译失败在require(at 3)行3. 或许一个必需的共享库或dll没有安装在预期的在persistence.perl第22行

install_driver(Oracle) failed: Can't load '/usr/local/lib64/perl5/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/lib64/perl5/DynaLoader.pm line 200. 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 persistence.perl line 22

在网上搜索我看到在Perl上设置env vars的正确方法是使用%ENV 哈希。

Searching on web I saw that the correct way to set env vars on Perl is to use %ENV hash.

通过unix shell(导出LD_LIBRARY_PATH = ..)导出 ORACLE_HOME 和 LD_LIBRARY_PATH 。)它可以正常工作。任何建议?

Exporting ORACLE_HOME and LD_LIBRARY_PATH through unix shell (export LD_LIBRARY_PATH=...) it works correctly. Any advice?

推荐答案

LD_LIBRARY_PATH 环境变量必须设置< em 之前,您的程序开始 - 在 perl 本身加载之前。在 BEGIN {} 中更改将影响您开始的新的程序,但不会影响共享库的加载 - 在这种情况下(尽管我从来没有使用DBD :: Oracle),您正在将已经运行的程序加载Oracle .so ,因此它是太迟更改了 LD_LIBRARY_PATH 。动态链接器 /lib/ld.so (等等)在 perl 之前启动,所以在你的脚本时被编译并且 BEGIN {} 运行,它已经设置。

The LD_LIBRARY_PATH environment variable has to be set before your program starts — before perl itself is loaded. Changing it in BEGIN{} will affect new programs that you start, but it won't affect the loading of shared libraries — in this case (although I've never used the DBD::Oracle) you're loading an Oracle .so into the already-running program, so it's "too late" to change the LD_LIBRARY_PATH. The dynamic linker /lib/ld.so (or so) is started before perl, so by the time your script is compiled and BEGIN{} runs, it's already set up.

你可以尝试重新执行您的脚本作为自己的后继者或某事*,但是一个简短的shell脚本几乎肯定是最简单的解决方案:

You could try to re-exec your script as its own successor or something*, but a short shell script is almost certainly going to be the simplest solution:

#!/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:

*- this would be kinda crazy, but 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; }

更多推荐

%ENV不工作,我不能使用共享库

本文发布于:2023-07-05 08:56:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1035434.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:我不   工作   ENV

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!