共有ライブラリを dlopen() で開いてみて、読み込まれるかどうかを確認し、読み込まれていない場合は dlerror() が何を表示するかを確認してください。私はいつもWindowsで同様の問題に遭遇します。LoadLibrary()/GetLastError() は何度も私を救ってくれました (前回は libiconv/libintl DLL の間違ったバージョンが原因でした)。プラグインで ldd を実行することも役立つ場合があります。
dlopen() が正常に動作する場合は、プラグインを QPluginLoader でロードしてみてください。読み込まれない場合は、プラグインのビルドキーを確認してください。私は通常、プラグインで文字列を実行してから、「buildkey」や「QT_PLUGIN_VERIFICATION_DATA」などの文字列を探すという汚い方法でそれを行います。ビルドキーとその周辺を見るだけで、アイデアが得られるかもしれません。たとえば、アプリケーションがデバッグ モードでコンパイルされているときに、プラグインをリリース モードでコンパイルしたことに気付く場合があります。このような場合、ビルド キーが一致せず、プラグインが読み込まれません。ビルド キーのすべてが構成と一致する必要があります。バージョンとビルド キーは異なる方法でチェックされることに注意してください: ビルド キーは正確に一致する必要があります (または QT_BUILD_KEY_COMPAT と呼ばれるブラック マジックと一致する) 必要がありますが、バージョンではメジャー バージョンのみが正確に一致する必要があります。マイナー バージョンは、プラグインがコンパイルされた Qt のバージョン以降である必要があり、パッチ レベルは無視されます。したがって、プラグインが Qt 4.xy でコンパイルされた場合、Qt バージョン 4.z.* (z>=x) で動作します。これは実際に理にかなっています。
ビルド キーに問題がないように見える場合 (この時点ではありそうもないことです)、QLibraryPrivate::isPlugin() のソース コードを調べて何が問題なのかを突き止めたいと思うかもしれませんが、それは私には簡単な作業ではないように見えます。 (ただし、これをデバッガーで実行すると役立つ場合があります)。
QPluginLoader がプラグインをロードする場合は、プラグインが正しいディレクトリにあり、正しい権限を持っているかどうかを確認してください。この時点でまだ問題が解決しない場合は、これらのプラグインを実際にロードする SQL モジュールのソース コードを確認してください。しかし、その可能性は非常に低いです。私はこの問題に何度も遭遇しましたが、常にライブラリがロードされていないか、ビルドキーが一致していませんでした。
QPluginLoader がプラグインを正常にロードした後のもう 1 つの方法は、strace を使用して、プログラムが少なくともプラグイン ファイルを開こうとするかどうかを判断することです。strace 出力で「sqldrivers」や「plugins」などを検索すると、Qt がプラグイン、特に SQL ドライバーを検索しているディレクトリも表示されます。
アップデート
ドライバーを静的プラグインとしてコンパイルすることは可能で、何も心配する必要はありませんか? やってみよう:
d:\Qt4\src\plugins\sqldrivers\psql>qmake CONFIG+=static LIBS+=-Ld:/programs/Post
greSQL/lib INCLUDEPATH+=d:/programs/PostgreSQL/include
d:\Qt4\src\plugins\sqldrivers\psql>make
それは正常にコンパイルされ、QTDIR/plugins/sqldrivers に libqsqlpsql.a (リリース) と libqsqlpsqld.a (デバッグ) を取得しました ( Windowsでは適切な場所です)。ここでは PostgreSQL ドライバーを使用していますが、インストールしていない MySQL でも変わらないと思います。では、それを使って実際のプログラムをコンパイルしましょう:
d:\alqualos\pr\archserv>qmake QTPLUGIN+=qsqlpsql PREFIX=d:/alqualos LIBS+=-Ld:/g
nu/lib INCLUDEPATH+=d:/gnu/include LIBS+=-Ld:/programs/PostgreSQL/lib LIBS+=-lpq
libpq に手動でリンクする必要があることに注意してください。そうしないと、リンカが未定義の参照について文句を言うことになります。面白いことに、qmake は qsqlpsql が QTDIR/plugins/sqldrivers にあることを認識し、それに応じてコンパイラとリンカーのオプションを設定します。コンパイル中にのみ使用されるため、ユーザーが同じ問題に遭遇することを心配する必要はありません。LIBS+=-Lpath/to/plugin LIBS+=-lqsqlpsql
別の方法は、代わりに を使用することですQTPLUGIN+=qsqlpsql
。少なくともドキュメントでは動作するはずですが、テストしていません。
アプリケーションが実際にプラグインを使用するためには、メイン ユニット (CPP ファイル) に次のものを配置する必要がありました。
#include <QtPlugin>
Q_IMPORT_PLUGIN(qsqlpsql)
できます!また、ソースから把握できたことから、ビルド キーとバージョンは、プラグインが動的にロードされた場合にのみチェックされます (関連するものはすべて、QPluginLoader ではなく、QLibrary のプライベート クラスにあります)。したがって、結果として得られる実行可能ファイルは、Qt の異なるバージョンやビルドでも動作する可能性があります (バイナリの互換性によっては動作しない場合があります)。ただし、古いバージョンで使用すると、後で修正されたバグが発生する可能性があります。
また、SQL ドライバーをロードする順序は次のとおりです。利用可能な場合は Qt に静的にリンクされたドライバーを使用し、次に QSqlDatabase::registerSqlDriver() で手動で登録されたドライバーを探し、アプリケーションに静的にインポートされたドライバーを探します。 (上記の方法)、最後に共有プラグインのロードを試みます。したがって、静的にリンクすると、ユーザーは動的にリンクされたドライバーを使用できなくなりますが、Qt に静的にリンクされたドライバーを使用できます (Ubuntu のように)。