Linux Qt 6安装Oracle QOCI SQL Driver插件(适用WSL)

news/2024/11/6 22:01:21/

本文参考 QOCI for the Oracle Call Interface (OCI)。
除一般的 Linux 系统外,本文也适用于 WSL 2。
在开始之前,如果没有安装 QOCI 插件,则试图链接 Oracle 数据库时会报错:

Failed to create wl_display (No such file or directory)
qt.qpa.plugin: Could not load the Qt platform plugin “wayland” in “” even though it was found.
“QOCI driver not available.”
qt.sql.qsqldatabase: QSqlDatabase: QOCI driver not loaded
qt.sql.qsqldatabase: QSqlDatabase: available drivers: QMIMER QPSQL QODBC QSQLITE QMARIADB QMYSQL
QSqlError(“”, “Driver not loaded”, “Driver not loaded”)

  1. 安装 CMake 等依赖。在 Oracle Instant Client Downloads for Linux x86-64 (64-bit)
    ,以 ZIP 安装为例,下载 Base - one of these packages is required - Basic Package (ZIP)、Tools - optional packages - SQL*Plus Package (ZIP)、Development and Runtime - optional packages - SDK Package (ZIP),展开网页内的Installation Instructions - Instant Client Installation for Linux x86-64 (64-bit) 教程操作,解压到/opt/oracle目录下(需要 sudo 权限)。其中,后两者均包含META-INFinstantclient_23_5两个目录,解压时合并目录,或使用cp -r命令合并目录。合并后目录结构如下:

BASIC_LICENSE legacy.so libclntsh.so.23.1 libocci.so libociei.so sqlplus
BASIC_README libclntsh.so libclntshcore.so libocci.so.10.1 libocijdbc23.so ucp.jar
SDK_LICENSE libclntsh.so.10.1 libclntshcore.so.12.1 libocci.so.11.1 libsqlplus.so ucp11.jar
SDK_README libclntsh.so.11.1 libclntshcore.so.18.1 libocci.so.12.1 libsqlplusic.so uidrvci
SQLPLUS_LICENSE libclntsh.so.12.1 libclntshcore.so.19.1 libocci.so.18.1 libtfojdbc1.so xstreams.jar
SQLPLUS_README libclntsh.so.18.1 libclntshcore.so.20.1 libocci.so.19.1 network
adrci libclntsh.so.19.1 libclntshcore.so.21.1 libocci.so.20.1 ojdbc11.jar
fips.so libclntsh.so.20.1 libclntshcore.so.22.1 libocci.so.21.1 ojdbc8.jar
genezi libclntsh.so.21.1 libclntshcore.so.23.1 libocci.so.22.1 pkcs11.so
glogin.sql libclntsh.so.22.1 libnnz.so libocci.so.23.1 sdk

保证目录内包含了sqlplussdksqlplus 可选,sdk 必需)。如果安装传统的 Oracle Client 21c 并使用 WSL,则需要 X11 依赖,如果采用的是 Qt Online Installer 安装的 Qt,则在安装程序阶段就已经安装过了相关依赖,故在此不作赘述。
2. 如果以上操作完成后/opt/oracle/instantclient_23_5目录内已包含链接libclntsh.solibocci.so则不需依照教程重新链接(ln -s)一遍。将

export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_3:$LD_LIBRARY_PATH
export PATH=/opt/oracle/instantclient_19_3:$PATH

添加到.bash_profile(如果用zsh可以直接添加到.zshrc)并source之。
3. 执行

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja /opt/Qt/6.8.0/gcc_64/bin/qt-cmake -G Ninja /opt/Qt/6.8.0/Src/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=/opt/Qt/6.8.0/gcc_64 -DOracle_ROOT=/opt/oracle/instantclient_23_5
cmake --build .
sudo cmake --install .

默认 CMake configuration 为“RelWithDebInfo”。
cmake-install4. 重新 CMake、编译项目。如果存在其他问题,可执行

sudo chmod +x /opt/Qt/6.8.0/gcc_64/plugins/sqldrivers/libqsqlite.so
/opt/Qt/6.8.0/gcc_64/plugins/sqldrivers/libqsqloci.so

至此 QOCI 插件成功安装。
注意:如果 Qt 版本小于 6.8.0,则第三步第三行命令应改为:

/opt/Qt/6.8.0/gcc_64/bin/qt-cmake -G Ninja /opt/Qt/6.8.0/Src/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=/opt/Qt/6.8.0/gcc_64 -DOracle_INCLUDE_DIR=/opt/oracle/instantclien
t_23_5/sdk/include -DOracle_LIBRARY=/opt/oracle/instantclient_23_5/libclntsh.so

其中Oracle_INCLUDE_DIR为存放oci.h等头文件的目录。


http://www.ppmy.cn/news/1544890.html

相关文章

【51单片机】串口通信原理 + 使用

学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 串口 串口是一种应用十分广泛的通讯接…

golang 实现比特币内核:处理椭圆曲线中的天文数字

在比特币密码学中,我们需要处理天文数字,这个数字是如此巨大,以至于它很容易超出我们宇宙中原子的总数,也许 64 位的值不足以表示这个数字,而像加、乘、幂这样的操作如果使用 64 位整数会导致溢出,因此我们…

需求分析管理

软件需求工程是包括创建和维护软件需求文档所必须得一切活动的过程,可以分为需求开发和需求管理两大工作。 需求开发过程(四阶段) 需求的分析(或者需求开发)过程包括,收集与获取需求,进行需求分析,定义需…

【react框架之dvajs】dva数据流你可能还不知道的subscriptions隐藏的秘密

Subscriptions 是一种从 源 获取数据的方法,它来自于 elm。 语义是订阅,用于订阅一个数据源,然后根据条件 dispatch 需要的 action。数据源可以是当前的时间、服务器的 websocket连接、keyboard 输入、geolocation 变化、history 路由变化等等…

机器学习—前向传播的一般实现

可以写一个函数来实现一个密集的层,那是神经网络的单层,所以定义稠密函数,它将上一层的激活作为输入以及给定层神经元的参数w和b。看下边图片所展示的例子,把所有这些权重向量堆叠成一个矩阵,wnp.array([[1,-3,5][2,4,…

机器学习,生成式Ai ,LLM大模型,人工智能,他们之间的关系是什么?有什么不同?

这些概念都是现代计算机科学和人工智能领域的重要组成部分,它们之间既有联系,也有区别。以下是它们的关系和不同之处: 人工智能 (AI) 人工智能是一个广义的概念,指的是计算机系统能够执行通常需要人类智能才能完成的任务&#x…

MySQL数据库的使用

一 关系数据库基本概念 关系数据库是一种使用关系模型来组织和管理数据的数据库。它使用了一种称为表的结构来存储数据,并通过表之间的关系来描述数据之间的联系。每个表由一组行和列组成,每一行代表一个记录,每一列代表一个属性。关系数据…

Go:接口和反射

接口 定义 在传统的面向对象的语言中,是会存在类和继承的概念的,但是Go并没有 那Go如何实现类似的方法呢?它提供了接口的概念,可以实现很多面向对象的特性 接口定义会实现一组方法集,但是这些方法不包含实现的代码…