首页 > 解决方案 > Oracle OCI 库在 AppImage 中打包时失败

问题描述

以下代码设置 OCI(Oracle 调用接口)环境,必须在尝试连接到数据库之前完成。它在作为普通程序编译和链接时工作正常,但是当我尝试将其打包到 AppImage 中时,OCIEnvCreate()返回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);
      }
}

标签: coracleappimage

解决方案


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


推荐阅读