1. 配置oracle环境和安装ocilib库
这里主要参考的是这篇文章,Linux 环境下调用C++库ocilib操作Oracle数据
期间遇到各种各样问题,现记录如下
1. oracle环境配置中碰到的问题
-
,打开服务器浏览器联网
-
配置 oracle环境变量:
-
sudo vi /etc/profile
在profile 添加 下面三行
-
source /etc/path 更新配置(最好重启下)
-
命令行输入:sqlplus,测试是否成功,正常如下:
-
sqlplus:
error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
:解决办法
-
sqlplus 测试是否能成功连接数据库
sqlplus 用户名/密码@ip地址:端口/service_name
-
2. 安装ocilib碰到的问题
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3d63dcd8b07e3dba3116822ff807e5bb.png)
6. 解决错误line 81: aclocal-1.14: command not found
7. ac_headers_path=/usr/include/oracle/11.2/client64
8. maake install 时
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1f43b326cad59a835c5d4a50a213ddf9.png)
2. 调用ocilib库,生成c++客户端
ocilib库默认位置:/usr/local/lib
oclib.h头文件位置:安装时用的压缩包的目录下的include下
oracle库默认位置:/usr/lib/oracle/11.2/client64/lib
- 相关目录解释
- . test.cpp
#include "ocilib.h"
void err_handler(OCI_Error *err)
{
printf("%s\n", OCI_ErrorGetString(err));
}
int main(void)
{
OCI_Connection* cn;
if (!OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT))
{
return EXIT_FAILURE;
}
cn = OCI_ConnectionCreate("(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=IP)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL1)))", "usr", "pwd",OCI_SESSION_DEFAULT);
printf("Server major version : %i\n", OCI_GetServerMajorVersion(cn));
printf("Server minor version : %i\n", OCI_GetServerMinorVersion(cn));
printf("Server revision version : %i\n\n", OCI_GetServerRevisionVersion(cn));
printf("Connection version : %i\n\n", OCI_GetVersionConnection(cn));
OCI_ConnectionFree(cn);
OCI_Cleanup();
return EXIT_SUCCESS;
}
- makefile文件
需要修改的地方:
TARGET 我的项目名就是test,所以就是TARGET = test.$(SUFFIX))
#############################################################
# Makefile for execute program.
# 编译运行程序文件
#############################################################
include ./global.make
#SYSINC = -I../
#set your own environment option
CPPFLAGS= $(BASICOPTS) $(INCLUDE)
CFLAGS= $(CPPFLAGS)
LDFLAGS=
DEPFLAGS= -MM $(BASICOPTS) $(INCLUDE)
#set your inc and lib
INCLUDE = -I../ $(SYSINC)
LIB = $(SYSLIBS)
#make target lib and relevant obj
TARGET = test.$(SUFFIX)
SRCS = $(wildcard *.cpp)
OBJS = $(patsubst %cpp,%o,$(SRCS))
DEPENDS=$(SRCS:%.cpp=%.d)
TASKPATH= $(PROGTASKPATH)
.PHONY: all clean init alld cleand
#all target
all: init clean $(TARGET)
cp -prf $(TARGET) $(TASKPATH)
init:
mkdir -p $(TASKPATH)
$(TARGET):$(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(LIB) $(RUNLIB)
alld: init $(TARGET) cleand
cp -prf $(TARGET) $(TASKPATH)
%.d:%.cpp
-@set -e; rm -f $@; \
$(CC) $(DEPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
ifeq ($(MAKECMDGOALS),alld)
-include $(DEPENDS)
endif
cleand:
-@rm -f $(DEPENDS)
clean:
rm -f $(OBJS) $(TARGET)
-@rm -f $(DEPENDS)
- globa.make 文件
需要修改的地方:
SYSINC:引用的ocilib.h头文件的位置
DB_BASIC_LIBS :oracle库、ocilib库的位置
UNAME=$(shell uname -s)
ifeq ($(UNAME), SunOS)
SUB_UNAME=$(shell uname -p)
ifeq ($(SUB_UNAME), sparc)
OS=OS_SOLARIS_SPARC
SUFFIX=dxe
else
OS=OS_SOLARIS_X86
SUFFIX=xxe
endif
CC = cc
BASICOPTS =-g -D_H9000V6
SPECIALLIBS = -lsocket
endif
ifeq ($(UNAME), AIX)
OS=OS_AIX
SUFFIX=axe
CC=gcc
BASICOPTS =-g -Wall -D_LINUX_SOURCE_COMPAT -D_H9000V6
SPECIALLIBS =
endif
ifeq ($(UNAME), Linux)
OS=OS_LINUX
SUFFIX=lxe
CC=g++
BASICOPTS =-g -Wall -Dlinux -D_LINUX_SOURCE_COMPAT -DSTRESS_TEST -gdwarf-2 -std=c++11 -Wno-deprecated -D_GLIBCXX_USE_CXX11_ABI=1
SPECIALLIBS =
endif
ifndef OS
$(error makefile has not supported the current os.)
endif
LIBTASKPATH= /home/hust/lib
PROGTASKPATH= /home/hust/bin
SYSINC = -I../ -I/home/hust/jars/flowd/ocilib-4.6.0/include
COMPILE = $(CC)
DB_BASIC_LIBS = -L/usr/lib/oracle/11.2/client64/lib -lclntsh -L/usr/lib/oracle/11.2/client64/lib -locci -L/usr/local/lib -locilib
SYSLIBS = $(DB_BASIC_LIBS)
3. 运行c程序,连接数据库
- 在上面的基础上,cd到 /home/hust/jars/flowd/test 下,先执行make命令生成可执行文件
- 执行
./test.lxe
参考内容:
1 . Linux 环境下调用C++库ocilib操作Oracle数据
2. ocilib 官方文档:ocilib 官方文档