linux下安装并调试ocilib(小白踩坑后记录)

关于linux相关的知识

实验机环境:CentOS Linux 7 (Core)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

1.安装虚拟机

直接装vmware软件,然后直接打开准备好的纯净版的虚拟机

2.安装编译环境

安装c语言编译器
yum -y install gcc

安装c++语言编译器
yum -y install gcc-c++

3.编译程序

直接编译出可执行文件testc
gcc test.c -o testc

直接编译出可执行文件test
g++ test.cpp -o test

编译出.a库
g++ -c test.cpp -o test.o
ar crv libafile.a test.o

使用.a库
通过头文件引用函数,头文件不用写出来
g++ -o test2 test2.cpp libafile.a

g++ -o test2 test2.cpp -L. -lafile

编译出.so文件
g++ -c -fPIC test.cpp -o test.o
g++ -shared test.o -o libsofile.so

使用.so文件
通过头文件引用函数
g++ -o test3 test3.cpp libsofile.so

g++ -o test3 test3.cpp -L. -lsofile

执行调用.so库的可执行文件时需要将.so文件拷贝到
/usr/lib

/lib
文件夹下

通过
ldd test
可以知道调用了什么库

4.设置环境变量

在文件/etc/profile的最后加入要设置的变量
比如
export ORACLE_HOME=/usr/lib/oracle/11.2/client64

最后一管理员身份执行
source /etc/profile

5.安装oracle的数据库套件

需要到oracle的官方网站下载安装包
https://www.oracle.com/database/technologies/instant-client/downloads.html
我下载的是11.2.0.4.0的64版本,也可以用12.x版本的,
主要是以下几个文件
oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
oracle-instantclient11.2-odbc-11.2.0.4.0-1.x86_64.rpm
oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
basic是必须装的
devel是c++程序连接用的
odbc好像是通过odbc访问用的,非必须
sqlplus是一个数据库访问工具,可以测试用

直接运行命令
rpm -ivh *.rpm
就安装完了,会在
/usr/lib/oracle/11.2/client64
目录下建立2个目录:bin lib
bin是可执行的文件,里面就有sqlplus,lib是c++程序调用需要的库

添加这些环境变量
export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/local/lib

在/usr/lib/oracle/11.2/client64/bin目录下执行sqlplus命令
./sqlplus user/pass@192.168.10.18:1521/PRODUCT_DB
连接到数据库,等一会出现
SQL>

可以编写个tns
创建文件夹
mkdir -p /usr/lib/oracle/11.2/client64/network/admin/

创建文件
/usr/lib/oracle/11.2/client64/network/admin/tnsnames.ora
内容是
PRODUCT_DB=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.18)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PRODUCT_DB)
)
)

6.编译ocilib

下在ocilib最新的版本
https://github.com/vrogier/ocilib/releases/
ocilib我理解的是调用上面装的 oracleclient 的相关库,就是 basic 和 devel 那些库
这是个开源库,应该不是oracle开发的东西

解压切换到文件夹下执行
./configure CFLAGS="-O2 -m64 -std=gnu99" --with-oracle-lib-path=/usr/lib/oracle/11.2/client64/lib --with-oracle-headers-path=/usr/include/oracle/11.2/client64

编译成64位版本
-O2 -m64

为了防止报: "只允许在 C99 模式下使用‘for’循环初始化声明" 的错误,必须加上
-std=gnu99

后面是指定ocilib的库文件和头文件的位置

最后执行
make
make install

库应该是安装到
/usr/local/lib

7.程序测试连接数据库

编写程序代码如下

//test_ocilib.cpp
include "ocilib.hpp"
include <stdio.h>

int main()
{
OCI_Connection * cn = NULL;

if ( !OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT) ){
	printf("init ocilib failed!\n");
    return -1;
}
printf("init ocilib success!\n");
printf("connect to db, please wait........\n");

cn = OCI_ConnectionCreate("192.168.10.18:1521/PRODUCT_DB", "user", "pass", OCI_SESSION_DEFAULT);
if ( cn != NULL ){
	printf("connect to db success!\n");
    printf("%s\n", OCI_GetVersionServer(cn));

    OCI_ConnectionFree(cn);
	printf("close db connection\n");
}

OCI_Cleanup();
printf("uninit ocilib\n");

return 0;

}

编译前检查下LD_LIBRARY_PATH是否正确
echo $LD_LIBRARY_PATH
这个值老是错,不知为何,正确的应该是
/usr/lib/oracle/11.2/client64/lib/:/usr/local/lib/
不对的source下

编译命令如下
g++ -o main test_ocilib.cpp -I/usr/include/oracle/11.2/client64 -L/usr/lib/oracle/11.2/client64/lib -lclntsh -locilib

最后检查下库能否都找到
ldd main

一切都没有问题后执行
./main

输出
init ocilib success!
connect to db, please wait........
connect to db success!
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
close db connection
uninit ocilib

其他功能都可以参考 ocilib 的 demo 文件夹下的文件

posted on 2020-04-02 14:49  litandy  阅读(995)  评论(0)    收藏  举报

导航