LinuxでのMS SQL ODBCドライバーのインストールとQt 5.9用のプラグインの構築

画像



数日前、Linux CentOS 7で動作し、MS SQL Server 2012と対話するコンソールアプリケーションを作成するという質問がありました。私はQtが大好きで、この問題を解決するためにそれを使用することにしました。 また、Windowsで必要な環境をすばやくセットアップした場合、Linuxでグーグルを使用して解決するのが非常に難しい問題に遭遇しました。 私はこの問題に1日半を費やしました。 私の経験を共有することは有用だと思います。おそらく誰かが貴重な時間を節約するのに役立つでしょう。



ツール



プラグインとアプリケーション自体をビルドするためにQtソースをサーバーにプルしたくありません。 したがって、 CentOS 7 LiveGNOMEイメージ取得してVirtualBoxマシンにインストールします。 完全な更新を行った後、 VirtualBox Guest Additionsを配置します。



g ++をインストールします。



sudo yum install gcc-c++
      
      





Linux x64用のQtインストーラーのダウンロード。 Qt 5.9.1をインストールし、さらにインストール中にソースチェックボックスを選択してソースを取得します。



SQL Server用のMicrosoft ODBCドライバーをインストールする



指示に従って、ドライバーインストールします。



 sudo su curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo exit sudo yum remove unixODBC-utf16 unixODBC-utf16-devel sudo ACCEPT_EULA=Y yum install msodbcsql sudo ACCEPT_EULA=Y yum install mssql-tools echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc source ~/.bashrc sudo yum install unixODBC-devel
      
      





ドライバは、VirtualBoxとソフトウェアが動作するマシンの両方にインストールする必要があります。



Qt QODBCプラグインのビルド



指示に従ってunixODBCをどこかにダウンロードし、解凍します。 ここで、unixODBCをコンパイルしてインストールする必要があります。 Qtのドキュメントと他のソースでは、ほとんどの場合、/ usr / local / unixODBCにunixODBCをインストールすることを提案する例を見ました。 もちろんこれは好みの問題ですが、私はそのような配置を使用します。 また、ドライバー構成ファイルを/ usr / local /などに配置します。これを行うには、unixODBCを次のパラメーターで構成する必要があります。



 ./configure --prefix=/usr/local/unixODBC --sysconfdir=/usr/local/etc
      
      





次に、収集してインストールします。



 make make install
      
      





次に、SQL Server用のMicrosoft ODBCドライバーを構成する必要があります。 これを行うには、/ usr / local / unixODBC / binに移動して実行します。



 sudo ./odbcinst -i -d -f /opt/microsoft/msodbcsql/etc/odbcinst.ini
      
      





上記のようにドライバーをインストールした場合、odbcinst.iniファイルの場所はまさにその場所になります。 それ以外の場合は、パスを決定する必要があります。 これらのすべての手順は、Virtualboxマシンと稼働中のマシンの両方で実行する必要があります。



次に、ODBCドライバーで動作するQtプラグインを作成する必要があります。 そしてこの瞬間から、まだ修正されていないバグに部分的に関連する問題が始まります。 プラグインを組み立てるには、松葉杖を適用する必要があります。 誰かが松葉杖のよりエレガントなバージョンを持っている場合は、コメントに書いてください。



そのため、通常の条件下での組み立てには、簡単な手順を実行する必要があります。 QT_DIR / 5.9.1 / Src / qtbase / src / plugins / sqldrivers / odbcに移動して実行します:



 qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib -lodbc" make make install
      
      





ただし、バグがあるため、エラーが発生する可能性が高くなります。



 Cannot read QT_DIR/5.9.1/Src/qtbase/src/plugins/sqldrivers/qtsqldrivers-config.pri: No such file or directory Project ERROR: Library 'odbc' is not defined.
      
      





qtsqldrivers-config.priファイルが存在しないことは無視できますが、2番目のエラーによりプラグインをビルドできなくなります。 これを回避するには、odbc.proファイルの行を置き換える必要があります。



 #QMAKE_USE += odbc
      
      





その後、qmake呼び出しを繰り返します。



 qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib -lodbc"
      
      





そして、出力Makefileを取得します。 別の問題は、コンパイラフラグ-Wdate_timeおよび-std = c ++ 1zであり、ビルドエラーが発生しました。



この時点で、すでにプラグインのビルドに多くの時間を費やしていたため、この問題を解決し、生成されたMakefileを開いて-std = c ++ 1zを-std = c ++ 11に変更し、フラグ-Wdate_timeを変更しました削除しました。 これらのフラグペアは2つの場所にあります。 最新のgccをインストールできますか、それとも、c ++ 17の代わりにc ++ 11を使用するようにqmakeにいくつかのパラメーターを指定できるかどうかを教えてもらえますか



あなたが何をしても、あなたは今やることができます:



 make make install
      
      





プラグインが組み立てられます。



テストアプリケーション



Qtでコンソールアプリケーションを作成し、接続をテストするために次のコードを記述しました。



 #include <QCoreApplication> #include <iostream> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> int main(int argc, char *argv[]) { QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); QString connectionString = "DRIVER={ODBC Driver 13 for SQL Server};Server=<host>\\<instance>,<port>;Uid=<login>;Pwd=<password>"; db.setDatabaseName(connectionString); if(db.open()) { std::cout << "Connection succes!" << endl; return 0; }else{ std::cout << db.lastError().text().toStdString() << endl; return 1; } }
      
      





Virtualboxマシンでプロジェクトを収集します。 私たちは、すべてがうまくいくと確信しています。 その後、プログラムのリリースバージョンを収集します。 Qtアプリケーションの展開プロセスについては説明しません。 おそらくこれは別の出版物のトピックです。 キーポイントのみを説明します。



実行可能ファイルに加えて、lddを使用して表示できる追加のライブラリが必要になります。 また、ビルドしたプラグインも必要です。 私の場合、QT_DIR / 5.9.1 / gcc_64 / plugins / sqldriversにあり、libsqlodbc.soと呼ばれています。 また、ドラッグする必要があります。 たとえば、ライブラリを/ usr / libに配置すると、システムがそれらを選択しますが、プラグインではこれは多少異なります。 プラグインをロードする場所をQtに伝える方法はたくさんあります。 最も簡単なのは、開始する前に環境変数QT_PLUGIN_PATHを定義することです。



プログラムを開始すると、すべてが機能するはずです。



おわりに



この問題に対する代替ソリューションについてのコメントを聞きたいです。 この投稿を補足/修正させていただきます。



All Articles