我正在做一个项目,最近我将 oracle 客户端库的静态链接更改为库的动态加载,每当它实际尝试从 OCI(Oracle 客户端库/ libclntsh.so
)调用函数时,程序将尝试dlopen()
使用绝对路径到libclntsh.so
. 它给了我以下错误
┌────────────────────────────────── Error ──────────────────────────────────┐ │ Could not open Dynamic Library: │ │ /aix64/oracle/client/12.1.0.2/client_1/lib/libclntsh.so (8013) │ │ DLL Error : Could not load module │ │ /aix64/oracle/client/12.1.0.2/client_1/lib/libclntsh.so. (8014) │ │ Unable to load shared library (14945) │ │ ORACLE error -1012 see "ORACLE Error Messages and Codes Manual". (1252) │ │ ** │ │ Failed to connect to ORACLE database lh. (1451) │ │ │ │ ────────────────────────────────────────────────────────────────────────── │ │ <OK> │ └────────────────────────────────────────────────────────────────────────────┘
PATH/LIBPATH
不可能是问题,因为我给出了libclntsh.so
in 的绝对路径dlopen()
。
可执行文件的权限、所有者和组是:
-rwsrwxr-x 1 root frnd 25835393 Dec 13 19:18 /some/other/abc
在寻找解决方案时,我知道由于设置了粘性位并且文件归 root 所有,当我执行它时,它无法获取LIBPATH
. 给出了库的路径,但未加载来自同一目录的两个依赖项,因此出现此错误。
任何人都可以提出一些建议。
PS:使用12.2.0.1.0 oracle库时(即:LIBPATH和ORACLE_HOME指向/oracle/client/12.2.0.1.0/),加载没有问题。我不明白这是怎么发生的。
TIA
您应该检查libclntsh.so
以找出它具有哪些依赖项:要么ldd libclntsh.so
或dump -H -X64 libclntsh.so
将做。
它可能是libons.so
或libclntshcore.so
取决于版本/变体。
另外,oracle 客户端也可能使用 dlopen 打开共享库(对于 InstantClient,它是libociei.so
.
总结一下:您应该设置LIBPATH
为/aix64/oracle/client/12.1.0.2/client_1/lib
,然后它可能会起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句