linux下occi使用问题

参考网上例子,写了个简单的C++连接ORACLE的DEMO,可是使用g++编译时不顺利,不是报这个错就是那个,最后参考网上的解决方式和个人理解,终于调试好了,现把编译中出现的问题和解决方法总结出来。

 

  源代码

 

C++代码

 

  1. #include <iostream>   
  2. #include <string>   
  3. #include "occi.h"   
  4. using namespace oracle::occi;   
  5. using namespace std;   
  6.   
  7. int main()   
  8. {   
  9.         string usr="sys";   
  10.         string pwd="orcl";   
  11.         string SID="ORCL";   
  12.         string date;   
  13.   
  14.         Environment *env=Environment::createEnvironment(Environment::OBJECT);   
  15.         Connection *conn= env->createConnection(usr,pwd,SID);//all strings   
  16.         if(conn)   
  17.                 cout<<"success createConnection!"<<endl;   
  18.         else  
  19.                 cout<<"failure createConnection!"<<endl;   
  20.   
  21.         Statement *stmt = conn->createStatement();   
  22.         string sSQL = "select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual";   
  23.         stmt->setSQL(sSQL);   
  24.   
  25.   
  26.         ResultSet *rs = stmt->executeQuery();   
  27.         if(rs->next())   
  28.         {   
  29.                 date = rs->getString(1);   
  30.         }   
  31.   
  32.         cout<<"now time :"<<date<<endl;   
  33.   
  34.         env->terminateConnection(conn);   
  35.         Environment::terminateEnvironment(env);   
  36.   
  37.         return 0;   
  38. }   
  39.     

 

 

  本人linux上安装oracle路径:/opt/app/oracle/product/10.2.0/db_1

 

  编译命令:g++ -o conn -L/opt/app/oracle/product/10.2.0/db_1/lib -L/opt/oracle/product/10.2.0/db_1/rdbms/lib conn_db.cpp -g

 

问题一:编译时报如下错误:

    

Shell代码

 

  1.       [oracle@localhost demo]$ g++ g++ -o conn -L/opt/app/oracle/product/10.2.0/db_1/lib -L/opt/oracle/product/10.2.0/db_1/rdbms/lib -lclntsh -locci /usr/lib/libstdc++.so.5 conn_db.cpp -g   
  2. g++: g++: No such file or directory   
  3. conn_db.cpp:3:18: error: occi.h: No such file or directory   
  4. conn_db.cpp:4: error: 'oracle' has not been declared   
  5. conn_db.cpp:4: error: 'occi' is not a namespace-name   
  6. conn_db.cpp:4: error: expected namespace-name before ';' token   
  7. conn_db.cpp: In function 'int main()':   
  8. conn_db.cpp:14: error: 'Environment' was not declared in this scope   
  9. conn_db.cpp:14: error: 'env' was not declared in this scope   
  10. conn_db.cpp:14: error: 'Environment' is not a class or namespace   
  11. conn_db.cpp:14: error: 'Environment' is not a class or namespace   
  12. conn_db.cpp:15: error: 'Connection' was not declared in this scope   
  13. conn_db.cpp:15: error: 'conn' was not declared in this scope   
  14. conn_db.cpp:21: error: 'Statement' was not declared in this scope   
  15. conn_db.cpp:21: error: 'stmt' was not declared in this scope   
  16. conn_db.cpp:26: error: 'ResultSet' was not declared in this scope   
  17. conn_db.cpp:26: error: 'rs' was not declared in this scope   
  18. conn_db.cpp:35: error: 'Environment' is not a class or namespace   
  19.        

 

  

    解决:编译时没有引入OCCI头文件,如果没有,先下载对应的ORACLE client安装,比如我的是oracle10g,下载了oracle-instantclient-basic-10.2.0.4-1.i386.zip,解压到一个目录下(/home/oracle/oracle/include),然后在编译文件的时候引进这个解压目录

 

   编译命令增加OCCI目录:g++ -o conn -I/home/oracle/oracle/include -L/opt/app/oracle/product/10.2.0/db_1/lib -L/opt/oracle/product/10.2.0/db_1/rdbms/lib conn_db.cpp -g

 

 

问题2:找不到对应函数

 

Shell代码

 

  1.    [oracle@localhost demo]$ g++ -o conn -I/home/oracle/oracle/include -L/opt/app/oracle/product/10.2.0/db_1/lib -L/opt/oracle/product/10.2.0/db_1/rdbms/lib conn_db.cpp -Wall -O -g   
  2. /tmp/cclFs9xq.o: In function `main':   
  3. /home/oracle/oracle/demo/conn_db.cpp:14: undefined reference to `oracle::occi::Environment::createEnvironment(oracle::occi::Environment::Mode, void*, void* (*)(void*, unsigned int), void* (*)(void*, void*, unsigned int), void (*)(void*, void*))'   
  4. /home/oracle/oracle/demo/conn_db.cpp:35: undefined reference to `oracle::occi::Environment::terminateEnvironment(oracle::occi::Environment*)'   
  5. collect2: ld returned 1 exit status    
  6.    

 

解决:增加libocci.so和libclntsh.so指定编译

 

  修改后的编译命令: g++ -o conn -I/home/oracle/oracle/include -L/opt/app/oracle/product/10.2.0/db_1/lib -L/opt/oracle/product/10.2.0/db_1/rdbms/lib conn_db.cpp -lclntsh -locci -Wall -O -g

 

  另外可能在引入-lclntsh -locci编译时可能会报找不到以下错误:

    

Shell代码

  1. [oracle@localhost demo]$ g++ -o conn -I/home/oracle/oracle/include -L/opt/app/oracle/product/10.2.0/db_1/lib -L/opt/oracle/product/10.2.0/db_1/rdbms/lib conn_db.cpp -lclntsh -locci /usr/lib/libstdc++.so.5 -Wall -O -g   
  2. /usr/bin/ld: cannot find -lclntsh   
  3. collect2: ld returned 1 exit status   
  4. [oracle@localhost demo]$    
  5.        

 

     解决:这是因为没有找到libclntsh.so和libocci.so链接库,你在可以把oracle client安装目录下把这两个文件拷贝到$ORACLE_HOME/lib目录下,或加到/usr/lib目录下就可以了

 

问题三:occi在linux编译运行时报libstdc++.so.6冲突的问题

   

代码

  1. [oracle@localhost demo]$ g++ -o conn -I/home/oracle/oracle/include -L/opt/app/oracle/product/10.2.0/db_1/lib -L/opt/oracle/product/10.2.0/db_1/rdbms/lib conn_db.cpp -lclntsh -locci -Wall -O -g   
  2. /usr/bin/ld: warning: libstdc++.so.5, needed by /opt/app/oracle/product/10.2.0/db_1/lib/libocci.so, may conflict with libstdc++.so.6  

 

  解决:OCCI库在linux编译的时候,由于linux版本太高,会提示以上情况,实际上,在大多数linux系统上,还保留有libstdc++5的库,自己手工在编译的时候加上去就好了

 

  修改后的编译命令:g++ -o conn -I/home/oracle/oracle/include -L/opt/app/oracle/product/10.2.0/db_1/lib -L/opt/oracle/product/10.2.0/db_1/rdbms/lib -lclntsh -locci /usr/lib/libstdc++.so.5 conn_db.cpp -g

 

  编译通过后执行结果输出:

  

Shell代码

 

  1. [oracle@localhost demo]$ g++ -o conn -I/home/oracle/oracle/include -L/opt/app/oracle/product/10.2.0/db_1/lib -L/opt/oracle/product/10.2.0/db_1/rdbms/lib conn_db.cpp -lclntsh -locci /usr/lib/libstdc++.so.5 -Wall -O -g   
  2. [oracle@localhost demo]$ ./conn   
  3. success createConnection!   
  4. now time :2010-11-14 22:49:24  
  5. [oracle@localhost demo]$   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值