我已经尝试了好几天在 Ubuntu 14.04 上安装 Oracle 11g。关于此问题有很多说明/教程,我已经尝试了十多个,但是运行 Oracle 安装程序时总是遇到同样的问题,在“链接二进制文件”步骤中,它总是显示以下消息:
Error in invoking target 'install' of makefile '/u01/app/oracle/product/11.2.0/dbhome_1/ctx/lib/ins_ctx.mk'. See '/u01/app/oraInventory/logs/installActions2015-01-07_03-25-51OM.log' for details.
在日志文件中显示
INFO: //usr/lib/x86_64-linux-gnu/libstdc++.so.5: undefined reference to `memcpy@GLIBC_2.14'
collect2: error: ld returned 1 exit status
从我浏览过的数十个论坛来看,大多数论坛似乎都认为问题在于 Ubuntu 安装了 libstdc++6,但 Oracle 11gR2 需要 libstdc++5。
因此,正如许多地方所建议的那样,我做了类似以下的事情,尽管我不得不花点时间才能找到正确的版本:
wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-3.3/libstdc++5_3.3.6-17ubuntu1_amd64.deb
dpkg-deb -x libstdc++5_3.3.6-17ubuntu1_amd64.deb ia64-libs
sudo cp ia64-libs/usr/lib/libstdc++.so.5.0.7 /usr/lib64/
cd /usr/lib64/
sudo ln -s libstdc++.so.5.0.7 libstdc++.so.5
wget http://security.ubuntu.com/ubuntu/pool/universe/i/ia32-libs/ia32-libs_2.7ubuntu6.1_amd64.deb
dpkg-deb -x ia32-libs_2.7ubuntu6.1_amd64.deb ia32-libs
sudo cp ia32-libs/usr/lib32/libstdc++.so.5.0.7 /usr/lib32/
cd /usr/lib32
sudo ln -s libstdc++.so.5.0.7 libstdc++.so.5
但它... 就是... 不... 起作用!
我已经重新启动等以确保它生效,但没有成功。这是在全新安装的 Ubuntu 14.04 上进行的,只设置了一些代理设置,并安装了 Java 7。
我创建了一个单独的oracle 用户(以及 oinstall 和 dba 组),我在运行之前以 oracle 用户身份运行运行安装程序从提取的 Oracle 下载中获取脚本。
是否有人有适用于 Ubuntu 14.04 和 Oracle 11gR2 的分步指南?
2015 年 1 月 9 日星期五更新
一些可能相关的信息。
在/usr/lib32/我有这个:
lrwxrwxrwx 1 root root 18 Jan 7 15:22 libstdc++.so.5 -> libstdc++.so.5.0.7
-rw-r--r-- 1 root root 737192 Jan 7 15:21 libstdc++.so.5.0.7
在/usr/lib64/我有这个:
lrwxrwxrwx 1 root root 42 Jan 7 13:46 libc_nonshared.a -> /usr/lib/x86_64-linux-gnu/libc_nonshared.a
lrwxrwxrwx 1 root root 48 Jan 7 13:47 libpthread_nonshared.a -> /usr/lib/x86_64-linux-gnu/libpthread_nonshared.a
lrwxrwxrwx 1 root root 18 Jan 7 14:52 libstdc++.so.5 -> libstdc++.so.5.0.7
-rw-r--r-- 1 root root 829792 Jan 7 14:51 libstdc++.so.5.0.7
lrwxrwxrwx 1 root root 40 Jan 7 13:47 libstdc++.so.6 -> /usr/lib/x86_64-linux-gnu/libstdc++.so.6
在~/.bashrc(对于 Oracle 用户)我有这个:
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=mydb
export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=/usr/lib32:/usr/lib64:$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$CLASSPATH
答案1
我在 Debian 8 (Jessie) 上使用 Oracle 11g R2 时遇到了同样的“对‘memcpy@GLIBC_2.14’未定义引用”错误。我通过以下解决方案解决了这个问题找到这里:
定义相关目录:
ORACLE_HOME="/u01/app/oracle/product/11.2.0/dbhome_1"
mkfile="$ORACLE_HOME/ctx/lib/ins_ctx.mk"
创建一个简短的 C 包装器:
cat << __EOF__ > /tmp/memcpy_wrap.c
#include <stddef.h>
#include <string.h>
asm (".symver wrap_memcpy, memcpy@GLIBC_2.14");
void *wrap_memcpy(void *dest, const void *src, size_t n) {
return memcpy(dest, src, n);
}
__EOF__
编辑 make 文件以使用此包装器并编译它:
sed -i -e 's/\$(INSO_LINK)/\$(INSO_LINK) -Wl,--wrap=memcpy_wrap \$(ORACLE_HOME)\/ctx\/lib\/memcpy_wrap.o/g' "$mkfile"
gcc -c /tmp/memcpy_wrap.c -o ${ORACLE_HOME}/ctx/lib/memcpy_wrap.o && rm /tmp/memcpy_wrap.c
答案2
我想我已经解决了这个问题。我是 Ubuntu 新手(刚刚在旧服务器上安装了 14.04),也一直在尝试解决 memcpy@GLIBC_2.14 问题。我遵循了您上面提到的相同说明等。
似乎libstdc++.so.5.0.7
最终会出现在多个位置/usr/lib64
,即/usr/lib/x86_64-linux-gnu
。当我浏览所有各种链接等时,似乎该/usr/lib64/libstdc++.so.5
库实际上指向位于的版本/usr/lib/x86_65-linux-gnu
。这比您(和我)下载的版本要新得多。
我复制了原件libstdc++.so.5.0.7
,/usr/lib/x86-64
然后将我们下载的文件复制到此目录中,并重新指向libstdc++.so.5
该文件的新版本的链接。
它继续前进。现在,我遇到了企业管理器的问题,会再回来处理这个问题。