這段時間做了好幾個基礎OCI的程序,在Windows上編譯后,不需要重新編譯, 就可以適應8i/9i/10g的客戶端,但在Linux/Unix上,編譯好后到不同的版本的客戶端去運行時, 總會提示找不到動態庫libclntsh.., 這時可以用以下辦法去解決:
第一步,修改genclntsh文件,這個文件在Oracle的bin目錄下
#
# Library names and locations
CLNT_NAM=clntsh # (short) library name
CLNT_VER=9.0 # library version number
CLNT_LNK=lib${CLNT_NAM}.so # name of symlink to library
CLNT_LIB=${CLNT_LNK}.${CLNT_VER} # actual library file name
LIB_DIR=${ORACLE_HOME}/${LIB} # lib. destination directory
改為:
#
# Library names and locations
CLNT_NAM=clntsh # (short) library name
CLNT_VER=9.0 # library version number
CLNT_LIB=lib${CLNT_NAM}.so # name of symlink to library
CLNT_LNK=${CLNT_LNK}.${CLNT_VER} # actual library file name
LIB_DIR=${ORACLE_HOME}/${LIB} # lib. destination directory
第二步,運行genclntsh重新生成客戶端的動態庫,這一步不要在正在運行的機器上做.
第三步,用gcc去編譯程序時加上以下選項.
gcc -o ocidemo.bin ocidemo.c -I${ORACLE_HOME}/rdbms/demo -L${ORACLE_HOME}/lib -lclntsh -Wl,-Bdynamic
第四步,編寫一個Shell去執行OCI程序(ocidemo.bin)
#!/bin/sh
if [ "A${ORACLE_HOME}A" = "AA" ]; then
echo "ORACLE_HOME environment variable not setted."
exit
fi
if [ "A${LD_LIBRARY_PATH}A" = "AA" ];then
LD_LIBRARY_PATH=/lib:/usr/lib
fi
if [ -d ${ORACLE_HOME}/lib32 ]; then
LD_LIBRARY_PATH=${ORACLE_HOME}/lib32:${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}
else
LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${ORACLE_HOME}/lib64:${LD_LIBRARY_PATH}
fi
export LD_LIBRARY_PATH
ocidemo.bin $*
我在RedHat Linux和Solaris上通過以上步驟解決OCI程序的運行庫文件問題.