8

Qt アプリケーションから MySql データベースにアクセスしようとしていますが、次のエラーが発生します。

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QSQLITE2

Qtフォルダーにlibqsqlmysql.soがあるという非常に奇妙な原因を見つけました。MySql ドライバーを静的プラグインとしてコンパイルし、次のように .pro ファイルに追加しようとしました。

QTPLUGIN += qsqlmysql

しかし、これも同じ実行時エラーを生成します (アプリケーションのコンパイルにエラーがないため、プラグインが見つかったに違いありません)。

私は何が欠けていますか?ソースから Qt をコンパイルする必要は避けたいと思います。これは、デプロイ マシンでもシームレスに動作する必要があるためです。

ところで: 私は Linux で開発とテストを行っていますが、Windows をサポートする必要があります。Windows でも同じ問題が発生しますか? Linux と Windows の両方で MySql ドライバーをコンパイルしてリンクするにはどうすればよいですか?

ソリューション:

@Sergeyの推奨事項に従った後、出力をgrepにリダイレクトするアプリケーションのstraceを行ったので、「mysql」を検索できました。驚いたことに、アプリケーションは、libqsqlmysql.soがあったQTDIR/plugins/sqldriversでプラグインを探していませんでした、QTDIR/libを見ていましたプラグインを lib フォルダーにコピーした後、MySql 接続が機能しました。

4

7 に答える 7

10

共有ライブラリを 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 のように)。

于 2010-12-18T19:44:00.357 に答える
3

最初に QT をコンパイルしてから、mysql も必要であることに気付きました。そこで、QT-DIR\src\plugins\sqldrivers\mysql フォルダーで次のコマンドを実行して、mysql プラグインをコンパイルしました。

Mysql プラグイン コンパイル コマンド

qmake "INCLUDEPATH+=$$quote(C:\Program Files\MySQL\MySQL Server 5.5\include)" "LIBS+=$$quote(C:\Program Files\MySQL\MySQL Server 5.5\lib\libmysql.lib)" mysql 。プロ

その後、QT-DIR\plugins\sqldrivers フォルダーにプラグインが作成されます。ただし、コードで使用しようとしたとき。以下のエラーで失敗しました。

エラー メッセージ

QSqlDatabase: QMYSQLDriver ドライバーがロードされていません

解決

グーグルでパス変数を確認した後、Mysql サーバー lib ( C:\Program Files\MySQL\MySQL Server 5.5\lib) ディレクトリがパス変数にないことに気付きました。このフォルダー内の dll は、実行時にプラグインによって使用されることを期待しています。パス変数に Mysql サーバー lib を含めた後、すべてがスムーズに機能しました。私はかなりの数を根こそぎにしたので、この情報が他のプログラマーの頭皮の髪を救うことを願っています. :D

于 2011-08-22T17:12:14.847 に答える
2

アプリが実行時にプラグインを取得できるようにするには、MySQL プラグインを実装する共有ライブラリを正しいディレクトリに配置する必要があります。そのディレクトリを決定する最善の方法は、 の出力を確認することですQCoreApplication::libraryPathsqt.conffileを使用して特定のパスを強制することもできます。

プラグインはプラグイン パス内のサブディレクトリに配置する必要があり、パス名の最後の部分 (つまり、共有ライブラリの親ディレクトリ)は変更できないことに注意してください。SQL ドライバは、という名前のディレクトリに移動する必要がありsqldriversます<pluginpath>/sqldrivers。プラグイン ディレクトリの詳細については、How to Create Qt Plugins を参照してください。

于 2010-12-18T20:49:32.843 に答える
2

前回これを見たとき、ソースから Qt を再構築し、適切な MySQL ソースを含める必要がありました。

ソースから Qt をビルドするのは難しくありません。少し時間がかかります。必要なツールはすでに用意されている可能性があります。

考えられる回避策は、代わりに ODBC 経由でバックエンドにアクセスすることです。

于 2010-12-18T18:59:25.570 に答える
1

よく私はこの問題を抱えていました.多くの時間とさまざまなツールの後、QT(Windowsでは、Linuxではテストできませんでした.)が要求されたときに「QSQLMYSQL ..」をロードすることがわかりましたが、実行前にlib ("QSQLMYSQL..") ファイルは、"sqldrivers" というフォルダー内の検索パス (QApp.libraryPaths()) のいずれかに存在する必要があります。そうでない場合、QT はファイルを無視します。検索されたパス。私がやったことは、サンプルアプリの依存関係を監視することで、「plugins\sqldrivers\」から「QSQLMYSQL..」dllを削除すると失敗しましたが、アプリフォルダー内に「sqldrivers」というフォルダーを作成し、そこに「QSQLMYSQL...」を入れて、ロードしました。私が持っているのは、mysql 5.5、qt 4.7.4 です。

誰もがこれを使用できることを願っており、誰かがそれについて詳しく知っている場合は、どこで見つけられるか知りたいです (http://doc.qt.nokia.com/stable/sql-driver.html が最も近いです)フォルダ構造に関する情報に)。:P

于 2011-09-27T21:43:57.373 に答える
1

私もこの同じ問題を経験していました。私はさまざまな Python ツールと UI をインストールして実験してきました。次に、Python関連のすべてをアンインストールしました。Python 3.2、PyQT 3.2、および Eric5 を新規インストールしました。QMySQL ドライバーでエラーが発生しなくなりました。

于 2011-04-14T19:01:04.327 に答える
0

これは、QMYSQL プラグインが「間違った」mysql_client.a に対してリンクされているか、LD_LIBRARY_PATH にない場合にも発生する可能性があります。mysqlがポート経由でインストールされたため、OSXでこの問題が発生し、次のように修正しました。

install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient_r.18.dylib libqsqlmysql.dylib
于 2013-12-06T10:39:00.853 に答える