2010-05-11 105 views
2

我的应用程序通过Qt的QSqlDatabase类访问Oracle数据库。如何在编译静态时摆脱OCI.dll依赖关系

我正在编译Qt为发布版本的静态,但我似乎无法摆脱OCI.dll依赖。我试图链接到oci.lib(如Oracle的Instant Client SDK中提供的)。

这里是我的配置行:

configure -qt-libjpeg -qt-zlib -qt-libpng -nomake examples -nomake demos -no-exceptions -no-stl -no-rtti -no-qt3support -no-scripttools -no-openssl -no-opengl -no-phonon -no-style-motif -no-style-cde -no-style-cleanlooks -no-style-plastique -static -release -opensource -plugin-sql-oci -plugin-sql-sqlite -platform win32-msvc2005 

我反对在SDK中的文件夹oci.h和oci.lib链接使用:

set INCLUDE=C:\oracle\instantclient\sdk\include;%INCLUDE% 
set LIB=C:\oracle\instantclient\sdk\lib\msvc;%LIB% 

然后,一旦Qt的编译,我在我的* .pro文件中使用以下行:

QT += sql 
CONFIG += static 
LIBS += C:\oracle\instantclient\sdk\lib\msvc\oci.lib 
QTPLUGIN += qsqloci 

然后,我ñ我main.cpp中,我添加了下面的命令来静态编译OCI插件中的应用:

#include <QtPlugin> 

Q_IMPORT_PLUGIN(qsqloci) 

编译项目后,我测试了我的工作站和它的作品(因为我有Oracle即时客户端安装)。当我尝试另一个工作站上,我总是得到消息:

此应用程序未能启动 因为OCI.DLL没有被发现。 重新安装此应用程序可能会修复 此问题。

我不明白为什么我仍然需要OCI.dll,因为我的静态链接应用程序应该链接到oci.lib。

有没有Qt的人可能对我有帮助?

非常感谢!

STL

回答

4

您链接的文件.LIB是不是你认为它是。它是DLL的导入库,链接器需要它,因此它知道oci.dll实现了哪些功能。我没有看到Oracle提供的静态版本的库,但看起来并不难。这对于dbase接口来说非常典型。

您需要按照部署说明中的oci.dll,“OCI即时客户端安装过程”中的this document。改变道路,哦,欢乐。

+0

感谢您的回答! 然而,我知道查尔斯伯恩斯能够静态链接OCI插件(没有oci.dll或所以它似乎):http://www.formortals.com/how-to-statically-link-qt-4/ 如果真的没有别的方式来使用Oracle,而不是使用我的应用程序分发几个DLL,那么我会做。 – STL 2010-05-11 18:43:46

+2

他正在谈论静态链接QT,而不是Oracle提供者。我认为大多数使用oracle的商店已经在他们的机器上安装了一个提供商。 – 2010-05-11 18:55:41

+0

这可能就是为什么它似乎不适合我! 无论如何,它对3个DLL工作得很好,所以我想我会这样。再次感谢 ! – STL 2010-05-11 19:21:06