4

この 2 日間、Qt 用の Oracle データベース ドライバーのデバッグとリリースの両方をビルドしようとしましたが、成功しませんでした。Qt Project で提供されているマニュアル (リンク) はかなり不完全であり、実際には示されているものよりもはるかに複雑です。

多くの試行錯誤の末、Web 上のいくつかの不完全な投稿の助けを借りて、最終的に dll を構築することができました。

どちらのソースも不完全で、dll の作成方法を正確に教えていないので、この質問に答えて、ここに方法を書きます。

まだ残っている唯一の疑問は、これを行うためのより良い方法はありますか? つまり、上記の Qt プロジェクトの Web サイトに示されているように、これらのライブラリをコンパイルする標準的な方法は、私 (および他の人) がしなければならなかったすべての手動作業なしで機能するはずだと思います。それで、私/私のQt/その他に何か問題がありましたか、それともQtプロジェクトのマニュアルが不完全でしたか?

4

1 に答える 1

4

だから、これはそれを行う方法です:

予備メモ:

QtSDK/QtCreator/Qt 4.8.1 32 lib がインストールされていたので、ディレクトリ システムに QtSources フォルダーと「Qt 4.8.1 for Desktop (MinGW)」(Qt で使用するために準備されたコマンド プロンプト) の両方がありました。また、A には Oracle データベース 32 がインストールされており、その中に「include」および「lib」フォルダーがあるフォルダー C:\Oracle\ がありました。「include」には oci.h などの .h があり、「lib」には oci.dll などの .dll と .lib があり、これらはすべてコンパイルに必要です。Qt プロジェクトのドキュメントに従って、"c:\oracle\bin" を PATH 環境変数に追加します (コンピューターのプロパティ -> 詳細システム設定 -> [詳細] タブ -> 環境変数 -> システム変数セクション)。

初挑戦:

MinGW 用に調整された、Qt プロジェクトの Web サイトに示されているコンパイルのデフォルト コード (実際にはデバッグ ライブラリ用のコード) は次のとおりです。

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 という一部のファイルが欠落していると報告されたことです。1 つ目は、mingw が上記のインクルード フォルダーに遭遇しようとしたときに何らかの問題が発生した結果です。

2 番目の問題は、ファイルを実際の場所から必要な欠落したパスにコピー アンド ペーストすることで解決されました。「C:\QtSDK\QtSources\4.8.1\src\sql\kernel」にあり、「C:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtSql\private」にコピーする必要があります ( 「プライベート」フォルダを作成する必要があります)。

同じ情報源によると、最初の問題は、%QTDIR%\src\plugins\sqldrivers\oci の makefile.release および makefile.debug ファイルの両方の INCPATH 変数に Oracle インクルード パスを配置することによって修正する必要があります。

デバッグ中:

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 パスも記載しています)。

これら 2 つのファイルを手動で調整する際の問題は、次回「qmake oci.pro」と入力したときに、両方が再作成され、調整が失われることです。そのため、Qt Project のコードをもう一度入力する必要がありますが、「qmake oci.pro」行は省略します。

2 回目の試行:

これを実行すると、最初の 2 つの問題は解決されましたが、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"

リリースも同様。

3 回目の試行:

これが完了したら、Qt Project のコード (「qmake oci.pro」なし) を入力すると正常に実行されます。唯一の問題は、デバッグ ライブラリしか作成されていないことです。したがって、これを修正するには、次の式で上記の手順のいくつかを繰り返す必要がありました。

  1. qmake 行を " qmake oci.pro "CONFIG+=release" " に変更して、元の Qt プロジェクト コードを入力します。
  2. %QTDIR%\src\plugins\sqldrivers\oci の makefile.release ファイルを前と同じように編集します。
  3. Qt プロジェクトのコードをもう一度入力します。qmake の行は省略します。

また、リリース モードの dll ファイルと .a ファイルも、%QTDIR%\src\plugins\sqldrivers\oci 内のそれぞれのフォルダーで検出されます。

仕上げ:

最後に、ファイル libqsqloci4.a、qsqloci4.dll (リリース)、libqsqlocid4.a、qsqlocid4.dll (デバッグ) を 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 Project コードでは、おそらく何の役にも立たないでしょう。また、元のコードを入力すると、デバッグ OCI ライブラリのみがコンパイルされます。

それが役立つことを願っています!

モメルギル

于 2013-07-11T19:21:38.240 に答える