0

私は QtCreator + mingw を使用しています。

QSQLITE2 プラグインをコンパイルしました。Qt ソース コードにプラグイン ディレクトリを入力しただけです。

c:\Qt\Qt5.2.0\5.2.0\Src\qtbase\src\plugins\sqldrivers\sqlite

そして、ローカルに持っているsqlite 2.8.17でビルドしました(dllおよびヘッダーとして):

qmake "LIBS+=-Lc:\projects\lib -lsqlite" "INCLUDEPATH+=c:\projects\include"
make
make install

すべてが正常に構築されます。

現在、QSQLITE2 Qt プラグインを使用する別の DLL (Qt プラグイン、カスタム プラグインとしても実装されています) があります。私自身の dll も sqlite.dll にリンクされています。したがって、次のようになります。

my.dll                       depends on sqlite.dll
%QT_PLUGINS%\qsqlite2d.dll   depends on sqlite.dll
my.dll                       uses qsqlite2d.dll through Qt's plugin engine
myApp.exe                    loads my.dll

問題は、私のアプリケーションが my.dll を読み込めないinvalid location accessことです。詳細はわかりませんが、それが問題です。

sqlite.dll、実行時にアプリケーション ディレクトリにあります。

アプリケーションをデバッグ モードで実行すると、一部のアセンブリ ファイルでクラッシュしますが、スタック トレースでは、sqlite_step シンボルの sqlite.dll 内のどこかにあることがわかります。私が知っているのはそれで全てです。

注1)my3.dllQSQLITEプラグイン(sqlite3用)を使用し、リンクされている別のプラグインdll、があり、これは問題sqlite3.dllなくロードされます。私自身も QSQLITE プラグインをコンパイルしました (Qt で提供されていたプラグインもありましたが、これは Qt が sqlite3 に静的にリンクされていて、動的にリンクするようにしたかったためsqlite3.dllです)。

注 2) どちらのプラグインも Linux では問題なく動作します。

何が間違っている可能性がありますか?他に何が確認できますか?

編集:

テストを実行しました:my.dllプラグインから削除して、まったくロードしないようにしました。次に、次のコードを追加しましたmain.cpp

    QSqlDatabase::addDatabase("QSQLITE2", ":memory:");

問題は、まったく同じスタックトレースでクラッシュしたことです(この行でデバッグしました)。したがって、sqlite2 Qt プラグインに何か問題があると思いますが、まだ何が問題なのかわかりません。私は他のものを探しましたsqlite.dll.sqlite.orgからダウンロードしたものです: http ://www.sqlite.org/sqlitedll-2_8_17.zip -これは公式ビルドですが、私が持っていたのとまったく同じファイルであり、失敗します同じ方法。

4

1 に答える 1

0

デバッグモードでコンパイルされていないため、qsqlite2d.dllリンクできないことが判明しました。リリース モードでアプリケーションを再コンパイルした後 (したがって、 ではなくを使用)、プラグインは正しく読み込まれ、動作します。sqlite.dllsqlite.dllqsqlite2.dllqsqlite2d.dll

これは理にかなっていますが、私を悩ませているもう1つのこと- qsqlited.dll(sqlite3の場合)とのリンクに問題はありませんでしたsqlite3.dll。デバッグまたはリリースをコンパイルしたかどうかに関係なく、単一のsqlite3.dllプラグインはデバッグ プラグインとリリース プラグインの両方で機能しました。誰でもそれがどのように可能か考えていますか? もしよろしければコメントください、よろしくお願いします。

于 2014-02-04T15:44:06.460 に答える