Qtライブラリを静的にリンクしたい
Qt 5.11.0 を使ってGUIアプリをつくろうとしているのですが、実行時の問題があります。
ソースは初心者用のサンプルソースコードで、Qt Creator を使って以下の「main.cpp」を作成しました。
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
ウインドウ生成は「mainwindow.cpp」で、
#include "mainwindow.h"
#include <Qtgui>
#include <QtWidgets>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QLabel *label = new QLabel(tr("Hello World."));
setCentralWidget(label);
}
MainWindow::~MainWindow()
{
}
となっています。
これをビルドして、Qt Creatorから実行するとウィンドウが表示されます。
しかし、単独で(ダブルクリックで)実行しようとすると
「コンピューターにQt5Cored.dllがないため、プログラムを開始できません。・・・」
というシステムエラーが表示され、実行できません。
これ以外に、mingwとmake を使って別のサンプルソースをコンパイルしても同様のエラーが出てきます。
実行ファイルと同じディレクトリにQt5Widgets.dll、Qt5Core.dll、Qt5Gui.dllの3つのDLLをコピーすると、実行できます。
しかし、いちいちDLLを要請するプログラム構成は好きでないのと、同名のライブラリlibQt5Widgets.a、libQt5Core.a、libQt5Gui.aがあることから、できれば静的にリンクしたいと思っています。
静的にリンクするために以下の4つの方法を試してみましたが、ことごとく失敗しています。
方法1 ライブラリを指定してリンク
g++ -static -O0 -g -o Qt_test.exe Qt_test.obj -lmingw32 -LC:\Qt\5.11.0\mingw53_32\lib -lQt5Widgets -lQt5Core -lQt5Gui -lqtmain -LC:\utils\my_sql\my_sql\lib -LC:\utils\postgresql\pgsql\lib -lshell32
のような書式で、3つのライブラリの順番を入れかえて6パターン試しましたが、DLLエラーは変わりません。
方法2 ライブラリをld.exeでまとめたオブジェクトファイルを作ってリンク
「GNUソフトウェアプログラミング」という本の112ページにリンカ「ld」のオプションについての記述があり、オブジェクトファイルとライブラリ同士をリンクする方法が紹介されていたので試してみましたが、未解決の参照がない?のか、20バイトのファイルが出力されただけでした。
ld -static -r -o qtobj.o C:\Qt\5.11.0\mingw53_32\lib\libQt5Gui.a C:\Qt\5.11.0\mingw53_32\lib\libQt5Widgets.a C:\Qt\5.11.0\mingw53_32\lib\libQt5Core.a
ld -static -r -o qtobj.o -LC:\Qt\5.11.0\mingw53_32\lib -lQt5Gui -lQt5Widgets -lQt5Core
方法3 arでオブジェクトファイルを作る
ar rs qto2.a C:\Qt\5.11.0\mingw53_32\lib\libQt5Gui.a C:\Qt\5.11.0\mingw53_32\lib\libQt5Widgets.a C:\Qt\5.11.0\mingw53_32\lib\libQt5Core.a
でライブラリをまとめたファイルは作れるのですが、コンパイルするとリンク時に
qto2.a: error adding symbols: Archive has no index; run ranlib to add one
となり、うまくいきません。
方法4 Qt creator で静的リンク
Qt Creatorで「ライブラリの追加」を行うと、「HelloWrold.pro」に以下の行が加わり、リンクできそうなのですが、実行時にやはりDLLを要求されます。
LIBS += -LC:/Qt/5.11.0/mingw53_32/lib/ -lQt5Core
結局は、Qtで静的なリンクを行う方法が知りたいのです。
ご助言をお願いいたします。
環境は、Win7、Mingw、QtはMingwパッケージオプションを付けてインストールしており、
「C:\Qt\5.11.0\mingw53_32\lib\libQt5Core.a」
「C:\Qt\5.11.0\mingw53_32\include」
「C:\Qt\5.11.0\mingw53_32\bin\Qt5Core.dll」
があり、中にDLLもライブラリもあります。
よろしくお願いします。
お礼
ふむふむ。 .net frameworkのランタイムの他に、J#にはこれが必要というわけですね。 これも6MBもある・・・。 配布するに当たって、ユーザーのしきいが高くなってしまいそうですね・・・。 >Javaのライブラリではありません、J#です これって、ヘルプにドキュメントが載っていないのですが、JAVA SDKとかで代用できるんでしょうか。 オブジェクトブラウザを見た感じ、中のクラスやメンバは同じっぽいし。
補足
どうやらMemoryStreamはGZIPOutputStreamにもZipOutputStreamにも入らず、java.ioのストリームを使う必要があるようです。 しかしJ#のjava.ioが、なんかbyte[]を渡したいところ、全部sbyte[]になってて非常に使いづらいですね。 せっかく同じようなByteArrayOutputStreamと言うものがあるのに・・・。