3

我正在尝试从运行 OSX 10.6 雪豹的英特尔 mac 连接到远程系统上的 Oracle 10.2.0.4。我尝试使用 perl CPAN 安装 DBD::Oracle(DBI 工作正常),但出现编译错误。有人可以提供一个易于遵循的指南吗?

4

5 回答 5

4

它看起来随着 XCode4 的更改(删除 PPC 架构支持),Perl 安装在任何 10.6.X 更新中都没有更新,也删除了 PPC 二进制文件(可能是因为 Rosetta 仍然存在)。

因此,配置文件保留“-arch ppc”,导致所有 CPAN 模块使用 C 库编译失败,因为 MakeMaker 的输出 Makefile 包含 -arch ppc。

要解决此问题,可以编辑以下文件:

/System/Library/Perl/5.10.0/darwin-thread-multi-2level/Config_heavy.pl  

在第 1219 行,您将看到:

$archflags = exists($ENV{ARCHFLAGS}) ? $ENV{ARCHFLAGS} : '-arch x86_64 -arch i386 -arch ppc';

将其更改为:

$archflags = exists($ENV{ARCHFLAGS}) ? $ENV{ARCHFLAGS} : '-arch x86_64 -arch i386';

一旦你这样做,生成的 Makefile 将是正确的。

于 2011-08-04T21:43:59.240 回答
4

让一个 mac 安装的 perl 与 oracle 很好地配合有点痛苦——一旦它运行起来就很棒,让它运行起来有点令人沮丧..

下面的内容在一些不同的英特尔 mac 上对我有用,其中很可能有多余的步骤,并且对于其他平台可能不会相同。

这将需要使用 shell、root 用户和一些 CPANing - 没什么太麻烦的

首先为 oracle pap-libraries、instant client 等创建一个目录

sudo mkdir /usr/oracle_instantClient64

从oracle下载并解压所有 64 位即时客户端软件包到上述目录

在该目录中为其中的一个文件创建一个符号链接

sudo cd /usr/oracle_instantClient64
sudo ln -s /usr/oracle_instantClient64/libclntsh.dylib.10.1 libclntsh.dylib

以下目录被硬编码到 oracle 即时客户端中 - 天知道为什么 - 所以需要创建和符号链接它

sudo mkdir -p /b/227/rdbms/
sudo cd /b/227/rdbms/
sudo ln -s /usr/oracle_instantClient64/ lib

需要添加几个环境变量,所以编辑 /etc/profile 并添加它们,以便所有用户都存在它们:

export ORACLE_HOME=/usr/oracle_instantClient64
export DYLD_LIBRARY_PATH=/usr/oracle_instantClient64

现在尝试通过 CPAN 安装 DBD::Oracle - 这将失败,但这意味着将下载任何依赖项并为我们检索模块

sudo perl -MCPAN -e shell
install DBD::Oracle

当此失败退出 CPAN 并前往您的 .cpan/build 目录 - 如果您使用 CPAN 的自动配置,它将是

cd ~/.cpan/build

如果您没有自动配置,您可以在 CPAN 中使用以下命令找到您的构建目录

o conf build_dir

在构建目录中查找刚刚创建的 DBD::Oracle 目录(它会被称为 DBD-Oracle-1.28-?)并 cd 进入它。

现在我们需要切换到root用户。osx 中默认未启用 Root - 有关启用的详细信息,请参阅苹果网站上的这篇文章

以 root 身份登录后,我们需要为 root 设置上述环境变量:

export ORACLE_HOME=/usr/oracle_instantClient64
export DYLD_LIBRARY_PATH=/usr/oracle_instantClient64

现在仍然以root身份登录,我们需要运行模块的makefile,然后make,然后安装

perl Makefile.pl
make
make install

假设所有工作都没有错误,从根目录中退出:我们已经 DBD 起来了!如果这不起作用,是时候在你看到的任何错误上淘汰谷歌了

现在只需安装 DBI 模块

sudo perl -MCPAN -e shell
install DBI

现在你已经准备好了 - 享受你的 perly oracley 新生活

来自 user852637 的附加信息:

  1. 修正这一步

    perl Makefile.pl
    make
    install
    

    最后一步应该是make install

  2. 在 make 期间,您可能会遇到如下错误:

    lipo:无法打开输入文件:/var/tmp//ccIevTzM.out(没有这样的文件或目录)

    要更正此问题,您必须编辑在“perl Makefile.pl”步骤之后创建的文件“Makefile”并删除所有出现的以下文本:

    -arch ppc 
    

    这将消除错误。

  3. 在安装 DBI 模块的过程中也会出现 (2.) 中描述的相同错误。您必须Makefile在该步骤之后编辑创建的perl Makefile.pl并删除所有出现的以下文本:

    -arch ppc 
    
于 2011-05-11T13:30:29.133 回答
3

这是一组很棒的说明。我对潜在的“陷阱”还有其他一些评论。

  1. 修正这一步

    perl Makefile.pl
    make
    install
    

    最后一步应该是make install

  2. 在 make 期间,您可能会遇到如下错误:

    lipo:无法打开输入文件:/var/tmp//ccIevTzM.out(没有这样的文件或目录)

    要更正此问题,您必须编辑在“perl Makefile.pl”步骤之后创建的文件“Makefile”并删除所有出现的以下文本:

    -arch ppc 
    

    这将消除错误。

  3. 在安装 DBI 模块的过程中也会出现 (2.) 中描述的相同错误。您必须Makefile在该步骤之后编辑创建的perl Makefile.pl并删除所有出现的以下文本:

    -arch ppc 
    
于 2011-07-19T18:53:15.220 回答
1

似乎“Perl MakeFile.pl”命令没有正确找到 Perl 的版本,我收到以下错误消息:

bash-3.2# perl Makefile.PL 
Multiple copies of Driver.xst found in: /Library/Perl/5.10.0/darwin-thread-multi-2level/auto/DBI/ /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/auto/DBI/ at Makefile.PL line 37
Using DBI 1.616 (for perl 5.010000 on darwin-thread-multi-2level) installed in /Library/Perl/5.10.0/darwin-thread-multi-2level/auto/DBI/

Configuring DBD::Oracle for perl 5.010000 on darwin (darwin-thread-multi-2level)

Remember to actually *READ* the README file! Especially if you have any problems.

Installing on a darwin, Ver#10.0
Using Oracle in /usr/oracle_instantClient64
Can't find sqlplus. Pity, it would have helped.
I'm having trouble finding your Oracle version number... trying harder

WARNING: I could not determine Oracle client version so I'll just
default to version 8.0.0.0. Some features of DBD::Oracle may not work.
Oracle version based logic in Makefile.PL may produce erroneous results.
You can use "perl Makefile.PL -V X.Y.Z" to specify a your client version.

Oracle version 8.0.0.0 (8.0)
DBD::Oracle no longer supports Oracle client versions before 9.2 
 Try a version before 1.25 for 9 and 1.18 for 8! at Makefile.PL line 175.

I've triple checked that I've downloaded and installed the proper 64-bit drivers from Oracle. I also checked to make sure that I'm running 64-bit Perl.

如果我强制这样的版本号:

perl MakeFile.pl -V 10.2.0.4

它完成了,但我在运行“make”时收到错误消息:

Oracle.c:2267: error: ‘SQLT_BIN’ undeclared (first use in this function)
Oracle.c:2277: error: ‘SQLCS_NCHAR’ undeclared (first use in this function)
Oracle.c:2281: error: ‘SQLT_INT’ undeclared (first use in this function)
Oracle.c:2283: error: ‘OCI_FETCH_PRIOR’ undeclared (first use in this function)
Oracle.c:2287: error: ‘OCI_FETCH_NEXT’ undeclared (first use in this function)
lipo: can't open input file: /var/tmp//ccyIFLPN.out (No such file or directory)
make: *** [Oracle.o] Error 1

我意识到这是因为需要从 Makefile 中删除“-arch ppc”参数,但即使在删除所有 32 位引用之后,我仍然看到错误消息。

使用 Oracle 驱动程序版本 10.2.0.4 运行 10.6.8 Snow Leopard

我发现这个问题的关键是确保 MakeFile.pl 可以找到 Oracle 版本。

我遇到的问题是 Safari 正在从 Oracle.com 下载 zip 文件,但解压缩它们并以某种方式损坏了库。

相反,我使用了不同的浏览器并将所有 zip 文件下载到一个目录中。然后我运行了以下 tar 命令:

tar -xf instantclient-basic-10.2.0.4.0-macosx-x64.zip 
tar -xf instantclient-sdk-10.2.0.4.0-macosx-x64.zip 
tar -xf instantclient-sqlplus-10.2.0.4.0-macosx-x64.zip

将文件夹“instantclient_10_2”中的所有内容复制到$ORACLE_HOME(之前设置)

sudo cp -R instantclient_10_2/* $ORACLE_HOME

此外,我不需要编辑 MakeFile.pl 脚本生成的 Makefile 来删除“-arch ppc”引用。

于 2011-07-26T21:59:41.887 回答
1

您不应该在您的机器上重新创建与客户端库打包程序相同的目录结构。

不要做mkdir -p /b/227/rdbms/

使用 MacOSX 库头管理工具:otoolinstall_name_tool

例如,我已将库头更新为我的部署架构:

otool -L /usr/oracle_instantclient/11.2.0.3.0-64-bit/libclntsh.dylib.11.1
/usr/oracle_instantclient/11.2.0.3.0-64-bit/libclntsh.dylib.11.1:
    /ade/b/2649109290/oracle/rdbms/lib/libclntsh.dylib.11.1 (compatibility version 0.0.0, current version 0.0.0)
    /ade/b/2649109290/oracle/ldap/lib/libnnz11.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

install_name_tool -id /usr/oracle_instantclient/11.2.0.3.0-64-bit/libclntsh.dylib.11.1 \
              -change /ade/b/2649109290/oracle/ldap/lib/libnnz11.dylib /usr/oracle_instantclient/11.2.0.3.0-64-bit/libnnz11.dylib /usr/oracle_instantclient/11.2.0.3.0-64-bit/libclntsh.dylib.11.1


otool -L /usr/oracle_instantclient/11.2.0.3.0-64-bit/libclntsh.dylib.11.1
/usr/oracle_instantclient/11.2.0.3.0-64-bit/libclntsh.dylib.11.1:
    /usr/oracle_instantclient/11.2.0.3.0-64-bit/libclntsh.dylib.11.1 (compatibility version 0.0.0, current version 0.0.0)
    /usr/oracle_instantclient/11.2.0.3.0-64-bit/libnnz11.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

检查 Oracle 即时客户端库附带的所有文件并修复所有依赖库的路径

otool -L adrci
otool -L genezi
otool -L libclntsh.dylib.11.1
otool -L libheteroxa11.dylib
otool -L libnnz11.dylib
otool -L libocci.dylib.11.1
otool -L libociei.dylib
otool -L libocijdbc11.dylib
otool -L libsqlplus.dylib
otool -L libsqlplusic.dylib
otool -L sqlplus
otool -L uidrvci

然后,您将动态库链接到它们应该在的位置。

你可以避免使用它,export DYLD_LIBRARY_PATH因为你知道如何设置你的系统

cd /usr/lib
ln -s ../oracle_instantclient/11.2.0.3.0-64-bit/libclntsh.dylib.11.1 .
ln -s ../oracle_instantclient/11.2.0.3.0-64-bit/libclntsh.dylib.11.1 libclntsh.dylib
ln -s ../oracle_instantclient/11.2.0.3.0-64-bit/libheteroxa11.dylib .
ln -s ../oracle_instantclient/11.2.0.3.0-64-bit/libnnz11.dylib .
ln -s ../oracle_instantclient/11.2.0.3.0-64-bit/libocci.dylib.11.1 .
ln -s ../oracle_instantclient/11.2.0.3.0-64-bit/libocci.dylib.11.1 libocci.dylib
ln -s ../oracle_instantclient/11.2.0.3.0-64-bit/libociei.dylib .
ln -s ../oracle_instantclient/11.2.0.3.0-64-bit/libocijdbc11.dylib .
ln -s ../oracle_instantclient/11.2.0.3.0-64-bit/libsqlplus.dylib .
ln -s ../oracle_instantclient/11.2.0.3.0-64-bit/libsqlplusic.dylib .
于 2013-11-13T14:09:54.663 回答