初探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
  • 代码很简单,一目了然后:
  1. 修改数据库帐号、密码、数据库tns名,env->createConnection(user, passwd, db)
  2. 在数据库中创建table
  • 编译语句:
 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)
  • 报错:
[[email protected] 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 -lclntsh
collect2: ld returned 1 exit status
  • 分析:
-lclntsh  指连接lib文件libclntsh.so
-locci    指连接lib文件libocci.so
Oracle客户端的lib包为:libclntsh.so.10.1、libocci.so.10.1
  • 解决方案:
cp libclntsh.so.10.1 libclntsh.so
cp 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。
  • 本人解决方案:
  1. 上传libstdc++.so.5到/usr/lib/下。
  2. 编译语句更改为: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/lib/libstdc++.so.5,强制使用5版本的so文件)

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> >::s
ize() 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++会被自动连接)

5、cannot restore segment prot after reloc

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

四、参考网址

取自“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

时间: 2024-10-13 03:18:44

初探oci之编译问题小结的相关文章

软件编译安装小结

本文主要针对 configure 和 cmake 做一个介绍以及我们重新配置编译参数文件时,都需要做哪些清理操作 做一个说明. configure和cmake的比较 configure 是一个sh脚本文件,它负责处理大量的幕后工作,包括检测操作系统内核和已经安装的软件,参数的解析,中间目录的生成以及根据各种参数生成一些C源码文件.Makefile文件等.它提供了非常多的参数选项供我们使用,我们可以通过这些参数选项来控制软件的安装目录.数据文件路径.配置文件路径,以及一些特殊选项如--with-p

go语言初探--一个helloworld编译出来有2.2M!

1. 安装, 用go的安装包安装好了go,终端敲下go,显示了go的help,看来go是没有交互界面的. 2. 新建个helloworld.go文件,写入 package main import "fmt" func main() { fmt.Println("hello world") } go run helloworld.go运行成功,打出了hello, world 3. 再试试编译,go build一下,helloworld可执行文件出现了, 本来我是很欣喜

第11/24周 重编译

今天我想谈下性能调优培训里的重编译(Recompilations ).当你执行一个查询,SQL Server里另一个变动使你执行计划的剩余部分无效,就会发生重编译.在那个情况下SQL Server需要保证你执行计划的准确性,重编译就会被触发.重编译会给你的SQL Server带来额外的CPU开销. 什么是重编译? 首先我想展示下编译和重编译之间的区别.2个星期前,我们讨论了SQL Server里的编译.当查询优化器把提交的查询转化为实际执行计划时,编译就会发生.这就是说编译在查询执行开始前就发生

Android源码编译

Android源码编译学习小结 内容 系统源码编译 笔者之前在学习安卓系统源码的编译,为了能够印象深刻,粗略的总结了以下内容,希望对我一样的初学者有一些帮助. 系统编译的初始化指令 对android编译环境进行初始化很简单,分为两步.第一步打开终端输入source build/envseup.sh加载所需的文件. $ source build/envseup.sh including device/asusource build/envseup.shs/grouper/vendorsetup.s

探秘重编译(Recompilations)(2/2)

原文:探秘重编译(Recompilations)(2/2) 在上一篇文章里,我讨论了使用临时表如何引起SQL Server里的重编译.在文章最后我提到,今天这篇文章我会聚焦表变量(Table Variables)的更多信息,它可以避免重编译的昂贵开销.我们来详细分析下. 表变量(Table Variables) 表变量总局限于提交到SQL Server的批处理语句范围.当你在批处理语句范围外引用表变量时,SQL Server就会返回你一条错误信息.这是和临时表相比第1个重大区别.下列代码向你展示

Bootstrap 4-alpha 初体验

What is Bootstrap? 第一句话就是废话了,作为新时代有理想有节操的开发人员无人不知无人不晓.可能就是熟悉程度因为各种原因不尽相同,有人只是知道他大概是个什么东西,有些人可能基本可以使用,有些人可能深有体会.但是纠正一下一个比较常见的问题,可能我这个人比较矫情,Bootstrap是一个单词,不要写成了BootStrap,还有重音在第一个字母http://fanyi.baidu.com/#en/zh/bootstrap,尊重作者. Bootstrap是新时代Web开发前端展示整体的解

Linux开发工具之gcc

linux开发工具 一.gcc入门(上) 1.gcc相关概念 gcc(GNU C Compiler)编译器,最初支持C语言,现已支持C.C++.Java.Pascal.Ada.COBOL语言等:支持多种硬件平台: gcc不仅仅是本地编辑器,他还能跨平台交叉编译: gcc有多重语言前端,用于解析不同的语言: gcc是模块化设计的,可以加入新语言和新CPU架构的支持: gcc是自由软件: 2.gcc编译程序过程示意图 hello.c-->预处理(cpp)hello.i-->编译器(ccl)hell

PHP扩展开发及内核应用

目录中汉字部分代表已经翻译完成的章节,带链接的表示已经发布的,未待链接的表示正在校正即将发布的. PHP的生命周期 让我们从SAPI开始 PHP的启动与终止 PHP的生命周期 线程安全 小结 PHP变量在内核中的实现 变量的类型 变量的值 创建PHP变量 变量的存储方式 变量的检索 类型转换 小结 内存管理 内存管理 引用计数 总结 配置编译环境 编译前的准备 PHP编译前的config配置 Unix/Linux平台下的编译 在Win32平台上编译PHP 小结 第一个扩展 一个扩展的基本结构 编

Linux下单独安装Oracle客户端

〇.前言 百度上面搜索的资料,都是垃圾资料,而且例子都是相互复制,确没有何参考价值, 最可烦的是需要安装oracle 远程客户端,他们那些笨蛋都是以本地为主,一般情况下本地如果有安装oracle, 也会安装好客户端,不需要那如群笨蛋发布那些无用的信息,浪费人家的时间.本文参考http://www.cnblogs.com/joeblackzqq/archive/2011/03/19/1988915.html http://wenku.baidu.com/view/bc8a311afad6195f3