在过去的两天里,我尝试为 Qt 构建调试和发布 Oracle 数据库驱动程序,但没有成功。 Qt Project ( link ) 中提供的手册远不完整,实际上事情比显示的要复杂得多。
经过多次尝试,我终于在网络上一些不完整的帖子的帮助下成功构建了 dll:
由于这两个来源都不完整,并且没有完全教您如何创建 dll,因此我将通过回答这个问题来在这里写下该方法。
唯一仍然存在的疑问是:有没有更好的方法来做到这一点?我的意思是,我认为编译这些库的标准方法(如上面引用的 Qt 项目网站中所示)应该可以在没有我(和其他人)必须做的所有手动操作的情况下工作。那么是不是我/我的 Qt/其他东西有问题,或者 Qt 项目的手册不完整,仅此而已?
最佳答案
所以这是如何做到的:
初步说明:
我安装了 QtSDK/QtCreator/Qt 4.8.1 32 lib,所以我的目录系统中有 QtSources 文件夹以及“Qt 4.8.1 for Desktop (MinGW)”——准备与 Qt 一起使用的命令提示符。 A 还安装了 Oracle 数据库 32,文件夹 C:\Oracle\里面有“include”和“lib”文件夹。在“include”中有 .h,例如 oci.h,在“lib”中有 .dlls 和 .lib,例如 oci.dll,它们都是编译所必需的。按照 Qt 项目文档,我将“c:\oracle\bin”添加到 PATH 环境变量(计算机属性 -> 高级系统设置 -> 选项卡“高级” -> 环境变量 -> 系统变量部分)。
第一次尝试:
编译的默认代码(实际上是调试库的一个)如Qt Project网站所示,针对MinGW进行了调整,如下所示:
set INCLUDE=%INCLUDE%;c:\oracle\oci\include
set LIB=%LIB%;c:\oracle\oci\lib\msvc
cd %QTDIR%\src\plugins\sqldrivers\oci
qmake oci.pro
mingw32-make
%QTDIR% 表示 Qt 源代码所在的文件夹。就我而言,这是:“C:\QtSDK\QtSources\4.8.1\”。提示:将此代码放入批处理文件(name.bat)中。
遇到的第一个问题是报告丢失了一些文件:oci.h 和 qsqlcachedresult_p.h。第一个是 mingw 尝试遇到上面的包含文件夹时某种问题的结果,而第二个可能是 Qt 错误:实际上缺少带有相应文件夹的 qsqlcachedresult_p.h。
第二个问题是通过将文件从其实际位置复制并粘贴到所需的丢失路径来解决的。它位于“C:\QtSDK\QtSources\4.8.1\src\sql\kernel”,应该复制到“C:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtSql\private”(需要创建“私有(private)”文件夹)。
根据同一来源,第一个问题应该通过将 Oracle 包含路径放在 %QTDIR%\src\plugins\sqldrivers\oci 中的 makefile.release 和 makefile.debug 文件中的 INCPATH 变量中来解决:
在调试中:
INCPATH = -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtCore" (...) -I"c:\Oracle\include" -I"c:\Oracle\lib\msvc"
发布中
INCPATH = -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtCore" (...) -I"c:\Oracle\include" -I"c:\Oracle\lib\msvc"
(我也把 lib 路径只是为了保证)。
手动调整这两个文件的问题在于,下次您键入“qmake oci.pro”时,这两个文件都将重新创建并且调整丢失。所以现在您应该再次输入 Qt 项目的代码,但不要输入“qmake oci.pro”行。
第二次尝试:
完成后,前两个问题就解决了,但 ld.exe 报告找不到 -loci(oci.dll 文件)。为了纠正这个问题,我将 oci lib 路径放在 LIBS 变量中:
在调试中:
LIBS = -L"c:\QtSDK\Desktop\Qt\4.8.1\mingw\lib" debug\qsqlocid_resource_res.o -loci -lQtSqld4 -lQtCored4 -L"c:\Oracle\lib\msvc"
释放也是一样。
第三次尝试:
完成此操作后,键入 Qt 项目的代码(不带“qmake oci.pro”)运行良好。唯一的问题是只创建了调试库。所以为了纠正这个问题,我不得不在下面的公式中重复上面的一些步骤:
现在也应该在 %QTDIR%\src\plugins\sqldrivers\oci 内的相应文件夹中遇到用于 Release模式的 dll 和 .a 文件。
精加工:
最后,将文件 libqsqloci4.a, qsqloci4.dll (release), libqsqlocid4.a, qsqlocid4.dll (debug) 复制到 C:\QtSDK\Desktop\Qt\4.8.1\mingw\plugins\sqldrivers ,sql dll 所在的文件夹位于 MinGW 以使用它们,您应该能够在 Qt 中使用 OCI 驱动程序没问题。要进行测试,请转到 Qt Creator 并键入以下或类似的代码:
if (!QSqlDatabase::isDriverAvailable("QOCI"))
cout << "FAILURE: No Oracle Database driver available." << endl;
else
cout << "SUCCESS: Oracle Database driver found." << endl;
教程结束。
得出的结论:线条
set INCLUDE=%INCLUDE%;c:\oracle\oci\include
set LIB=%LIB%;c:\oracle\oci\lib\msvc
在原始的 Qt 项目代码中可能没有任何帮助。同样输入原始代码只会编译调试 OCI 库。
我希望它会有所帮助!
莫默吉尔
关于windows - 如何使用 MinGW 在 Windows 上构建 Qt QOCI(Oracle 数据库驱动程序)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17601662/