如何在Alpine中使用C++编译并运行Oracle OCI/OCCI程序

问题描述 投票:0回答:1

我在尝试在 Alpine docker 中使用 C++ 编译(更准确地说,链接)OCCI 程序时遇到一些问题。 我已经按照这个问题中的一些步骤安装了 Instant Client 21.14,并且已经创建了符号链接并设置了环境变量。 当我尝试链接如下所示的简单 C++ 程序时,我的问题就出现了:

g++ -o oracleclient OracleClient2.o -L"$ORACLE_HOME" -locci -lclntsh
/// Or
g++ -o oracleclient OracleClient2.o -L"$ORACLE_HOME" -locci_gcc53 -lclntsh

此编译步骤在 Ubuntu 中有效,但在 Alpine 中我遇到很多链接错误,其中一些是:

ld: warning: libdl.so.2, needed by /usr/lib/instantclient/libocci_gcc53.so, not found (try using -rpath or -rpath-link)
ld: /usr/lib/instantclient/libclntsh.so: undefined reference to `sigfillset@GLIBC_2.2.5'
ld: /usr/lib/instantclient/libocci_gcc53.so: undefined reference to `operator new(unsigned long)@GLIBCXX_3.4'
ld: /usr/lib/instantclient/libclntsh.so: undefined reference to `sigprocmask@GLIBC_2.2.5'
ld: /usr/lib/instantclient/libclntsh.so: undefined reference to `pthread_cond_timedwait@GLIBC_2.3.2'
ld: /usr/lib/instantclient/libclntshcore.so.21.1: undefined reference to `pthread_attr_setschedpolicy@GLIBC_2.2.5'

首先,我不知道如何在Alpine中安装libdl.so.2,第二个问题是,据我了解,Alpine使用musl-libc,而Oracle共享库使用glibc,因此它们不兼容。 已经尝试安装 gcompat 但它没有解决我的问题。

如有任何帮助,我们将不胜感激。

我尝试在 Alpine docker 中链接并执行 OCCI C++ 应用程序,但显然 Instant Client 的共享库与 Alpine 不兼容。

c++ oracle docker alpine-linux instantclient
1个回答
0
投票

使 Alpine Linux 设置更小的原因之一是使用备用系统 C 库(musl libc 而不是 GNU libc)。 您看到的一些库(如

libdl.so.2
)是核心 C 库的一部分。 很难更换。

如果您看到引用其中一些系统库的链接错误,或明确引用

symbolname@GLIBC_...
版本标记,那么您的应用程序可能根本无法在 Alpine 上运行。 几乎所有其他 Linux 发行版(包括 Debian、Ubuntu 和 RHEL)都基于 GNU libc,并且在其他发行版上不会出现这些链接错误。

有一些关于“运行 glibc 程序”的 Alpine 文档,但它们很大程度上归结为复杂的模拟层。 该页面最终开始讨论使用 chroot 环境和容器作为在基于 Alpine 的环境中运行需要 GNU libc 的程序的好方法,此时您实际上不再使用基本的 Alpine 容器。 因此,我会将您的映像更改为基于另一个 Linux 发行版,例如

FROM debian:bookworm AS build RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive \ apt-get install --assume-yes --no-install-recommends \ build-essential ... RUN g++ -o oracleclient OracleClient2.o -L/opt/oracle/lib -locci -lclntsh FROM debian:bookworm ... COPY --from=build /app/oracleclient /usr/local/lib CMD ["oracleclient"]

	
© www.soinside.com 2019 - 2024. All rights reserved.