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