如何编译Perl的Oracle模块?

    发现我们用的Perl在数据库版本变化后(如8i到9i, 9i到10g)时, DBD-Oracle模块都需要重新编译Perl才能工作. 在多种数据库版本混合使用的环境下, 就需要安装几个Perl(或只使用一个版本的客户端)才能解决问题, 其中的原因是因为编译出来的Oracle.so会去找特定版本的Oracle客户端库文件, 如下所示:

$ldd ./lib/site_perl/5.8.5/sun4-solaris-64/auto/DBD/Oracle/Oracle.so
        libclntsh.so.9.0 =>      /export/home/oracle/products/9201/lib/libclntsh.so.9.0
        libnsl.so.1 =>   /usr/lib/64/libnsl.so.1
        libsocket.so.1 =>        /usr/lib/64/libsocket.so.1
        ......

    其实在每一个Oracle的客户端库目录下都会有一个"libclntsh.so"的链接指向"libclntsh.so.ver", 如果在ldd的输出中只去查找"libclntsh.so"的话, 就可以解决在8i/9i/10g下的重新编译的问题了. 我在编译OCI程序时, 就没有不同版本的客户端的问题.

$ldd ociuldr.bin
        libm.so.1 =>     /usr/lib/libm.so.1
        libclntsh.so =>  /export/home/oracle/products/9201/lib32/libclntsh.so
        ......

    今天就将这个方法用在Perl的DBD-Oracle模块中试试吧, 首先下载DBD-Oracle源程序, 然后就可以开始了. 如果你只想替换Oracle.so文件, 则需要注意下载的源代码的版本要和现在正在用的一致.

    Perl分32位和64位, DBD-Oracle也分为32位和64位. 在解压源程序后, 首先用以下命令生成Makefile:

32Bit: perl Makefile.PL -r=build32
64Bit: perl64 Makefile.pl -r=build64

    接下来执行make命令就可以编译了, 可以用以下命令查找Oracle.so的所在位置:

$find ./ -name Oracle.so
./blib/arch/auto/DBD/Oracle/Oracle.so

    用这个刚生成的文件去换掉现在正在使用的文件, 然后在8i/9i/10g的客户端下试试? Oracle的客户端库的位置如下:

32Bit
8i:${ORACLE_HOME}/lib
9i:${ORACLE_HOME}/lib32
10g${ORACLE_HOME}/lib32

64Bit
8i:${ORACLE_HOME}/lib64
9i:${ORACLE_HOME}/lib
10g${ORACLE_HOME}/lib

    只要根据你编译的版本, 设置合适的LD_LIBRARY_PATH变量(AIX5L下是LIBPATH变量).

留言 (1)

下载1.19版本, 在10g的环境下编译, Makefile.PL中将opt_V设为8, 就可以了.

我已经在8i/9i/10g上测试过了.

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • I plan to learn photography.
  • 我打算学摄影.
  • What do you say we have a party this weekend?
  • 我们周末开个派对, 你觉得怎么样?
  • She will certainly remain single.
  • 她肯定会保持独身.
  • He will probably follow in his father's footsteps.
  • 他可能会继承父业.
  • I would have had a much better holiday if I had stayed at home.
  • 我要是呆在家里的话, 假期会好过的多.