Oracle OCI 库在 AppImage 中打包时失败

Oracle OCI library fails when packaged in AppImage

以下代码设置 OCI(Oracle 调用接口)环境,必须在尝试连接到数据库之前完成。当作为普通程序编译和链接时它工作正常,但是当我试图将它打包到 AppImage 中时,OCIEnvCreate() returns OCI_ERROR.

如果我设置 LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib/ AppImage 会按预期工作。显然,AppImage 构建器所做的库欺骗在 Oracle 库上以某种方式失败了。有什么技巧可以让它们在 AppImage 中工作吗?

(设置 LD_LIBRARY_PATH 不是解决方案,因为我试图不必在每个客户端上安装 Oracle 库。)

在 CentOS 8、GCC 8.4.1 和 10.2.1、oracle-instantclient12.2-devel-12.2.0.1.0-1 上测试。x86_64

#include <oratypes.h>
#include <oci.h>
#include <stdio.h>

int main() {
    OCIEnv        *envhp;
    int status;
    status = OCIEnvCreate((OCIEnv **)&envhp,
            (ub4) OCI_DEFAULT,
            (void  *)0, (void  * (*)(void  *, size_t))0,
            (void  * (*)(void  *, void  *, size_t))0,
            (void (*)(void  *, void  *))0,
            (size_t)0, (void  **)0);
      if (OCI_ERROR == status) {
        printf("Failed: OCIEnvCreate()\n");
      } else if (OCI_SUCCESS == status) {
        printf("Success: OCIEnvCreate()\n");
      } else {
        printf("Other return status '%d' from OCIEnvCreate()\n", status);
      }
}

appimage 构建器没有自动将所有 OCI 共享库复制到 AppImage。将每个 .so 文件添加到 linuxdeploy 命令行,每个库文件的 --library /path/to/library.so 解决了这个问题。大概是一些 .so->.so 依赖没有被自动过程解决。