我面临一个奇怪但明智的问题,我有 2 个 ORACLE_HOME,第一个指向 ORACLE 数据库软件,第二个指向 ORACLE 客户端软件。
为什么我被迫这样做 - 原因是:在我的系统中,Pro *c 是从 ORACLE 数据库 ORACLE_HOME 编译的,但是 Pro *Cobol 是从 ORACLE 客户端 ORACLE_HOME 编译的。
编译 Pro *Cobol:
echo $LD_LIBRARY_PATH
/u01/app/oracle/product/11.2.0/client/lib:/opt/FJSVcbl64/lib:/opt/FJSVXbsrt/lib:/opt/FJSVXmeft/lib:/opt/FJSVcbl/COBOL/lib:/opt/FJSVcbl/COBOLRT/lib
编译 Pro *C
echo $LD_LIBRARY_PATH
/u01/app/oracle/product/11.2.0/db_1/lib:/opt/FJSVcbl64/lib:/opt/FJSVXbsrt/lib:/opt/FJSVXmeft/lib:/opt/FJSVcbl/COBOL/lib:/opt/FJSVcbl/COBOLRT/lib
如果我将路径即 /u01/app/oracle/product/11.2.0/db_1/lib 和 /u01/app/oracle/product/11.2.0/client/lib 都放在 1 LD_LIBRARY_PATH 中,则只有先到者才能获得成功的。
有没有办法解决这个问题?
对于临时修复,我在每个文件中创建了 2 个具有不同 LD_LIBRARY_PATH 的小脚本;所以我在编译 Pr *C 或 Pro *Cobol 之前调用这个脚本。
我只是不想调用任何脚本,只有 1 个 LD _LIBRARY_PATH 必须能够修复它。
让我知道。
谢谢!
正如@Thomas 在他的评论中所说,问题在于客户端和服务器包含一组非常相似的库,如果找到具有匹配名称的库,则使用它,无论它最终是否有效。
没有办法克服这一点,至少不是你想要的方式。没有“特定于应用程序”
LD_LIBRARY_PATH
,因此您可能不得不坚持使用您的脚本。无法在 LD_LIBRARY_PATH 中给出 2 个具有相同名称的库文件的路径,系统读取顺序中的第一个将被首先读取和使用。然而...
如果您在命令前面(在同一行)使用 LD_LIBRARY_PATH=.... 调用您的命令,那么您可以避免需要一个脚本来切换变量。
除了变量定义和命令之间的单个空格之外,不应有分隔符,如下所示:
LD_LIBRARY_PATH=/usr/local/lib64:${LD_LIBRARY_PATH} /path/to/your/command
这只会为该命令的单次运行设置变量,所以是的,您每次都必须这样做。但是,您不必再通过脚本“切换”变量。
如果您使用的是 GUI 环境,您也可以将上述内容(当然需要修改)放入桌面快捷方式。