初探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的區別
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”