初探oci之編譯問題小結,初探oci小結

來源:互聯網
上載者:User

初探oci之編譯問題小結,初探oci小結
〇、前言

繼續上篇文章的講述,讓我們一塊走進神奇的oci。

一、oci的概念

ORACLE調用介面(Oracle Call Interface簡稱OCI)提供了一組可對ORACLE資料庫進行存取的介面子常式(函數),通過在第三代程式設計語言(如C語言)中進行調用可達到存取ORACLE資料庫的目的。

在普通的情況下,使用者可以通過SQL和PL/SQL來訪問資料庫中的資料。ORACLE調用介面ORACLE資料庫除了提供SQL和PL/SQL來訪問資料庫外,還提供了一個第三代程式設計語言的介面,使用者可以通過C、COBOL、FORTRAN等第三代語言來編程訪問資料庫。OCI就是為了實現進階語言訪問資料庫而提供的介面。OCI允許開發人員在程式裡使用SQL和PL/SQL來訪問資料庫。開發人員可以使用第三代語言來編寫程式,而使用OCI來訪問資料庫。

OCI是由一組應用程式開發介面(API)組成的,ORACLE提供API的方式是提供一組庫。這組庫包含一系列的函數調用。這組函數包含了串連資料庫、調用SQL和事務控制等。在安裝DBMS SERVER或者用戶端的時候,就安裝了OCI。

二、oci demo開發
  • 在部署好的Oracle用戶端環境中,/opt/oracle/sdk/demo下面有oci demo程式:
 occidemo.sql、occidml.cpp
  • 代碼很簡單,一目瞭然後:
  • 編譯語句:
 g++ -I/opt/oracle/sdk/include -I/usr/local/include/boost -L/opt/oracle/lib -o ociTest occidml.cpp -lclntsh -locci /usr/lib/libstdc++.so.5
  • 下面開始編譯和測試。
三、編譯過程中碰到的問題1、-lclntsh -locci
  • 問題:-lclntsh -locci
  • 報錯:undefined reference to `oracle::occi::Environment::createEnvironment
  • 解決方案:-lclntsh這是串連oracle的動態庫,沒有這個就不能串連oracle了


2、cannot find -lclntsh
  • 問題:cannot find -lclntsh(-lclntsh -locci)
  • 報錯:
[root@bogon cppTest]# g++ -I/opt/oracle/sdk/include -I/usr/local/include/boost -L/opt/oracle/lib -o ociTest occidml.cpp -lclntsh -locci /usr/lib/libstdc++.so.5/usr/bin/ld: cannot find -lclntshcollect2: ld returned 1 exit status
  • 分析:
-lclntsh  指串連lib檔案libclntsh.so-locci    指串連lib檔案libocci.soOracle用戶端的lib包為:libclntsh.so.10.1、libocci.so.10.1
  • 解決方案:
cp libclntsh.so.10.1 libclntsh.socp libocci.so.10.1 libocci.so
3、Oracle與libstdc++.so
  • 問題:Oracle與libstdc++.so
  • 報錯:libstdc++.so.5, needed by /opt/oracle/lib/libocci.so, not found

或者:warning: libstdc++.so.5, needed by /home/oracle/OraHome1/lib/libocci.so, may conflict with libstdc++.so.6

  • 分析:

Oracle10.2.0.4的會依賴與低版本的標準C++庫libstdc++.so.5

  • 推薦的解決方案:
1)downgrade the oracle to 10.2.0.2.2)Append the libstdc++.so.5 to package, and use command “ cd /usr/lib;      ln /opt/webex/imds/lib/so/libstdc++.so.5.0.7  libstdc++.so.5”      By this way, when compiling, compiler will report : /usr/bin/ld: warning: libstdc++.so.5, needed by /home/oracle/OraHome1/lib/libocci.so, may conflict with libstdc++.so.6       I am still not sure whether will affect the action of program. Need run for a period to test.3)  Build all library which imds is using, include TP, WDMS, Jabber decrypt. It is very hard and painful.4) Upgrade oracle to 11個人認為,方案4會更好一些。方案2在嘗試中,根據調查,最好不要在一個程式中同時依賴 libstdc++.so.5和libstdc++.so.6。
  • 本人解決方案:
  • 參考網址:http://jimmyleeee.blog.163.com/blog/static/93096182009113035926272/

http://www.itpub.net/thread-465101-1-1.html


4、g++和gcc的區別
  • 問題:g++和gcc的區別
  • 報錯:
undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const'undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned int) const'undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned int) const'undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned int) const'undefined reference to `std::cout'undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'undefined reference to `std::ios_base::Init::Init()'undefined reference to `std::ios_base::Init::~Init()'collect2: ld returned 1 exit status
  • 解決方案:gcc HelloWorld.cpp -lstdc++ -o HelloWorld

g++ HelloWorld.cpp -o HelloWorld (用g++, 效果是一樣的, stdc++會被自動連接)

  • 參考網址:http://blog.sina.com.cn/s/blog_698f90230100y6ir.html
5、cannot restore segment prot after reloc
  • 問題:cannot restore segment prot after reloc的問題
  • 報錯:libnnz10.so: cannot restore segment prot after reloc
  • 解決方案:chcon -t texrel_shlib_t /opt/oracle/lib/*.so*
  • 參考網址:http://blog.csdn.net/qinpeng2000/article/details/6065041

http://hi.baidu.com/kzsoft/blog/item/a507ca182fbdf10135fa41a4.htmlhttp://www.cppblog.com/soak/

四、參考網址
  • 比較全面的錯誤總結:http://wenku.baidu.com/view/73fb0ec79ec3d5bbfc0a7405.html
  • Linux系統的標頭檔和庫檔案搜尋路徑:http://it.china-b.com/lixt/457143_2.html
取自“http://192.168.5.252/mediawiki/index.php/%E5%88%9D%E6%8E%A2oci%E4%B9%8B%E7%BC%96%E8%AF%91%E9%97%AE%E9%A2%98%E5%B0%8F%E7%BB%93--20120605”

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.