みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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もライブラリもあります。

よろしくお願いします。

投稿日時 - 2018-03-02 00:10:32

QNo.9434173

暇なときに回答ください

質問者が選んだベストアンサー

Qt の静的ライブラリは公式からは提供されていませんので、自分でソースからビルドする必要があります。
例えば、URLの記事を参考にしてみてください。

私もやったことがありますが、公式のサポートは無い茨の道だわ、リンク時間は長いわ、プログラムサイズは大して小さくならないわで、一利も無いのでやめました。
また、商用ライセンスを購入しない限りはGPLになることもご注意ください。

参考URL:https://qiita.com/informationsea/items/df2775c325769d6f56b3

投稿日時 - 2018-03-02 23:31:16

お礼

なるほど、ありがとうございます。参考URLを参照したところ、「不可能ではないけれど・・・」という印象です。確かに、かなり頑張る必要がある割にはメリットないですね。
”公式のサポートは無い”、”リンク時間は長い”、”プログラムサイズは大して小さくならない”
貴重な情報ありがとうございます。
現在のところ、自分以外にリリースする予定はないので、これほど煩雑な静的リンクを頑張る必要はないことに気づきました。
広大な横道に逸れるよりQtを使いこなすほうに注力しようと思います。
ありがとうございました。

投稿日時 - 2018-03-04 23:23:04

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

Qtライブラリを静的リンクをする方法は知りませんが(この手の奴は静的リンクするには単純にライブラリの指定順番を変えるだけでなく相互参照なども考慮して何度も書かないといけなかったり(-lQt5Gui -lQt5Widgets -lQt5Core -lQt5Guiみたいな)と組み合わせが無数にありすぎますし実行ファイルのサイズが小さくなるわけでもないので労力の割に合わないですから)、
方法3の手順は、libQt5Gui.a,libQt5Widgets.a,libQt5Core.aのアーカイブファイルを更にアーカイブしているだけなのでリンクには使えません。
もし、やるのでしたら一度オブジェクトファイルにばらしてarでまとめる事になります。

投稿日時 - 2018-03-03 13:20:35

お礼

ありがとうございます。
arを誤解していたようです。しかもこの方法では結局静的リンクできないことがわかりました。
結局、静的リンクは公式非サポートでメリットもほとんどないことがわかりましたので、素直にDLLを使うことにします。

投稿日時 - 2018-03-04 23:27:26

あなたにオススメの質問