linux 上面安装了install client,根据网上的配置,也做了配置,但是写的例子城西,第一个OCI函数OCIEnvCreate直接运行崩溃。
install client安装了zip版的basic sdk sqlplus
install client 安装目录:
[root@app-node-V-G instantclient_11_2]# pwd
/usr/local/oracle/instantclient_11_2
运行的库(lib sqlplus直接在当前目录,include在sdk目录,tns文件在netwrok/admin目录):
[root@app-node-V-G instantclient_11_2]# ls
adrci         glogin.sql         libnnz11.so      libocijdbc11.so  NETWORK     sdk             xstreams.jar
BASIC_README  libclntsh.so       libocci.so.11.1  libsqlplusic.so  ojdbc5.jar  sqlplus
genezi        libclntsh.so.11.1  libociei.so      libsqlplus.so    ojdbc6.jar  SQLPLUS_README库文件已经配置到/etc/ld.so.conf文件中,测试例子编译连接都没有问题配置的oracle_home等变量,在/etc/profile中,环境变量已经生效
export ORACLE_SID=primdb
export ORACLE_HOME=/usr/local/oracle/instantclient_11_2
export TNS_ADMIN=$ORACLE_HOME/NETWORK/ADMIN
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME
export SQLPATH=$ORACLE_HOME
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export PATH=$PATH:$ORACLE_HOME调用的例子程序:
OCIEnvCreate(&m_pEnv, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);
直接调用这一句报段错误。 
66                      OCIEnvCreate(&m_pEnv, OCI_THREADED|OCI_EVENTS|OCI_OBJECT|OCI_NCHAR_LITERAL_REPLACE_ON, NULL, NULL, NULL, NULL, 0, NULL);
(gdb) Program received signal SIGSEGV, Segmentation fault.
0x00007ffff791f0b3 in kpedbgevpec () from /usr/local/oracle/instantclient_11_2/libclntsh.so.11.1怀疑是install client的配置可能还有问题。从网上找的配置,基本都尝试了,还是报这个错误,不知道怎么解决了。 
oracleociOCIEnvCreate 崩溃

解决方案 »

  1.   

    补充:刚才写了个单独的oci测试程序,调试没有问题。这样应该说oracle 环境配置没有问题了。 测试程序直接从项目代码里头拷贝出来的。 测试代码:#include <string.h>
    #include <string>
    #include <stdlib.h>
    #include <stdio.h>
    #include <oci.h>using namespace std;int main(int argc ,char** argv)
    {
    string m_strIp = "10.10.71.80";
       string m_strUser="test";
       string m_strPwd="test";
       string m_strDbName="test";
       int  m_nPort=1521; 
       int  m_nConnNum =2 ;
       int  m_nMaxConnNum = 10;
       string m_strSID;  
       
    OCIEnv *m_pEnv;
    OCIError *m_pErr;
    OCIServer *m_pSrv;
    OCICPool *m_pCPool;
    OCIAuthInfo *m_pAuthInfo;
    unsigned char* m_CPoolName;
    sb4 m_CPoolNameLen;
    sword r;
    //初始化环境
    r = OCIEnvCreate(&m_pEnv, OCI_THREADED|OCI_EVENTS|OCI_OBJECT|OCI_NCHAR_LITERAL_REPLACE_ON, NULL, NULL, NULL, NULL, 0, NULL);
    printf("%d \n",r);
    // 产生一个指定环境的错误句柄
    r = OCIHandleAlloc((dvoid *)m_pEnv, (dvoid **)&m_pErr, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);
    printf("%d \n",r);
    // 产生一个指定环境的服务句柄
      r = OCIHandleAlloc((dvoid *)m_pEnv, (dvoid **)&m_pSrv, OCI_HTYPE_SERVER, (size_t)0, (dvoid **)0);
      printf("%d \n",r);
    //产生一个连接池句柄
    r = OCIHandleAlloc((dvoid *)m_pEnv, (dvoid **)&m_pCPool, OCI_HTYPE_CPOOL, (size_t)0, (dvoid **)0);
    printf("%d \n",r);

    m_CPoolNameLen = 2048;
    m_CPoolName = (unsigned char*)malloc(m_CPoolNameLen);
    memset(m_CPoolName,0,m_CPoolNameLen);
    if(OCI_SUCCESS != OCIConnectionPoolCreate(m_pEnv,m_pErr,m_pCPool,(unsigned char**)&m_CPoolName,&m_CPoolNameLen,
    (unsigned char *)m_strSID.c_str(),m_strSID.length(),m_nConnNum,m_nMaxConnNum,1
    ,(unsigned char*)m_strUser.c_str(),m_strUser.length(),(unsigned char*)m_strPwd.c_str(),m_strPwd.length(),
    OCI_CPOOL_REINITIALIZE))
    {
    sb4 errCode = 0;
    OraText errDesp[1024]= {0};
    OCIErrorGet((dvoid *)m_pErr, (ub4) 1, (text *) NULL, &errCode,
    errDesp, (ub4) sizeof(errDesp), OCI_HTYPE_ERROR);
    //WriteLog("COracleConnPool-InitOracleCPool", errCode<<":"<<errDesp);
    //ReleaseAllConn();
    return -1;
    }
    OCIHandleAlloc((dvoid*)m_pEnv,(dvoid**)&m_pAuthInfo,OCI_HTYPE_AUTHINFO,0,NULL);
    OCIAttrSet((dvoid*)m_pAuthInfo,OCI_HTYPE_AUTHINFO,(char*)m_strUser.c_str(),m_strUser.length(),OCI_ATTR_USERNAME,m_pErr);
    OCIAttrSet((dvoid*)m_pAuthInfo,OCI_HTYPE_AUTHINFO,(char*)m_strPwd.c_str(),m_strPwd.length(),OCI_ATTR_PASSWORD,m_pErr);
    return 0;
    }