iamlaosong文
原有一套Pro*C程序运行在RedHat5.5+Oracle10g环境下,随着数据的增加,原服务器不堪重负,新买了一台服务器。厂家说新服务器不能安装原来的环境,只能安装RedHat6.6+Oracle11g,所以原来的那套程序要移植到新服务器上,移植过程中碰到很多问题,很多是自己没有经验造成的。
1、直接拷贝原来的执行程序
程序在新环境运行后提示需要运行库libclntsh.so.10.1,这个是Oracle10的库,心想肯定要重新编译了,于是将源程序拷贝过来,重新编译。
2、重新编译源程序
编译后提示找不到库文件libclntsh.so.11.1,但这个文件是有的,所以怀疑makefile在新环境下是不是不行,在网上找了几个,都不行,折腾半天,发现是环境变量问题,需要设置LD_LIBRARY_PATH,当然这中间还有一些曲折,就不多说了,用命令 vi ./.bash_profile可以编辑的环境变量设置批处理文件,内容如下:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
export ORACLE_BASE=/opt/11g/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$PATH:HOME/bin:$ORACLE_HOME/bin
LD_LIBRARY_PATH=/usr/lib:/usr/lib64
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
LD_LIBRARY_PATH=$ORACLE_HOME/rdbms/lib:$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH NLS_LANG
error: curses.h: No such file or directory
查原服务器确实有curses.h这个文件,在/usr/include目录下,新服务器却没有,以为这个文件被删了,复制了一个,结果编译的时候被错误刷屏了,可见不是拷贝一个能解决问题的。查询相关资料,得知需要安装ncurses。
3、安装ncurses
从安装光盘或ISO文件的Packages目录中找到安装包ncurses-devel-5.7-3.20090208.el6.x86_64.rpm,传到服务器任意目录,root用户下进入该目录执行下面的安装命令即可:
rpm -ivh ncurses-devel-5.7-3.20090208.el6.x86_64.rpm
这儿有个小插曲,网上看到的安装命令是:yum install ncurses-devel ncurses
结果安装不上,只好用rpm命令直接安装,后来才知道,yum命令不是在当前目录下找安装包,而是需要将安装包放在/var/cache/yum目录下。
安装完成后,重新编译程序,一切正常!本程序的makefile内容如下:
include $(ORACLE_HOME)/precomp/lib/env_precomp.mk
INCLUDE = -I. -I$(ORACLE_HOME)/rdbms/public
CC = gcc
#PROC = proc
REMOVE = rm -f
FILES = sdptmain.o wu_proc.o loaddata.o
FILES1 = sdpt_no.o wu_proc.o loaddata.o
.SUFFIXES: .pc .c .o
all: sdpt_bz sdpt_no clean
sdpt_bz:$(FILES)
$(CC) -o sdpt_bz $(INCLUDE) $(FILES) $(LDPATHFLAG)$(LIBHOME) $(PROLDLIBS)
sdpt_no:$(FILES1)
$(CC) -o sdpt_no $(INCLUDE) $(FILES1) $(LDPATHFLAG)$(LIBHOME) $(PROLDLIBS)
.pc.o:
$(PROC) iname=$* parse=none
$(CC) $(INCLUDE) -c $*.c
.pc.c:
$(PROC) iname=$* parse=none
.c.o:
$(CC) $(INCLUDE) -c $*.c
clean:
rm -f *.c *.o *.lis tp*
最后,令人啼笑皆非的是直接拷贝过来的程序也可以执行了,不再提示缺少库libclnts h.so.10.1了,可见当时这个提示是环境变量不对,环境变量对了,就可以找到库libclntsh.so.10.1,后来查了一下,果然$ORACLE_HOME/lib目录下libclntsh.so.10.1和libclntsh.so.11.1都有。