2010-05-11 100 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