FC2ブログ

Qtでプロジェクトを引き継いだときの諸問題の解決

統合開発環境初心者(IDEってコレダヨネ)がQtのプロジェクトを引き継いで運用することになりました.
運用って言っても内輪で使う程度のもので,現状で完成してるから引き継ぎできるよう維持していってという程度なのだけど.

そんな私が早速維持できずに,スタックしたわけです.悲しい.

PCに関してはWin10, 64bit程度だけ言えばいいですかね.

まず,Qtをインストールします.そこからスタック.
全く気づかずに,QtのうちVS2015でコンパイルする版をインストール.しかし私のPCにはすでにVS2017がインストール済み.
2015に戻る必要もないのにインストールしたモノ自体に目がいかず,なんでコンパイルできないのーなんてただやって1週間.
アホですね.

気づいて,QtのMinGWのやつをインストールし直す.
Qt Creatorを起動.とりあえずコンパイルぽい動きはしてくれた.
早速エラー.なんだろう.なんだ…これは…
(時刻): ディレクトリ "C:\Users\~~~\" Util.asciify("build-(ソフトの名前)-Desktop_Qt_5_6_2_MinGW_32bit-unknown")" でエラー: TypeError: Property 'asciify' of object Core::Internal::UtilsJsExtension(0x35fb720) is not a function" を作成できませんでした
と出る.これはすぐ解決して,Qt Creatorの左タブにある「プロジェクト」で,
debugでもreleaseでも,シャドウビルドのチェックボックスを切っておく.

そして,47個のエラーを吐きながらも,exeファイルを生成してくれた.前任者もそのまま残していったエラーだろうと踏んで,exeの実行にかかる.
さあ,exeを実行してみよう(release版を実行するけど,debug版でやると後ろにdが付いたdllファイルを言われるよ).
エラー.
Qtエラー
こんな感じってよくありますよね・・で,
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll
libgcc_s_dw2-1.dll
をまず最初に言われます.
この点に関して,似た記事はこちら.
うぇぶとらばぁす 作ったアプリケーションの実行
どこにあるのかな,と探すとインストールしたQtのフォルダの中にあります.
ちなみに,私がやった順で説明しますと
C:\Qt\Qt5.6.2\Tools\QtCreator\bin
C:\Qt\Qt5.6.2\Tools\mingw492_32\bin
から引っ張ってきて,exeのあるフォルダにコピーしました(QtとMinGWのインストールしたバージョンはフォルダ名の通りです).
これが…実は間違いだったのですが.続けて,実行すると
libstdc++-6.dll
libwinpthread-1.dll
が足りないよといいます.Qt系じゃないのでMinGWにあるだろうと思って探してちゃんとあります.同じくコピー.
さあ実行.
え?技術的に私が及ばなそうなエラーが来ました.
プロシージャ エントリ ポイント _Z4endlR11QTextStreamがダイナミック リンク ライブラリ
C:\Users\~~~\(実行したexeファイル名) から見つかりませんでした。
ちょっと頭が働いた私はダイナミックリンクライブラリがdllだということに気が付きます.しかしこれは,結果的にヒントになりませんでした(正しいわけですが).ずっと空回りして1週間を費やしたのです.
結論を先にいいますと,dllを取ってくるフォルダが間違っていたというものです.正しくは
C:\Qt\Qt5.6.2\5.6\mingw49_32\bin
から取ってくればよいです.すると正しく実行できます.この記事を読む人は,すぐ解決できるでしょう.
ちなみに,exe実行時の初めのエラーを検索した方は,Toolsのフォルダからコピーすればいいという記事を見つけるはずです.それは間違っている…少なくとも私の例ではそうなりますので,お気をつけて.
なぜ2種類あるのか…実は2種類以上あるんじゃないのか…という問題ですが,これはかんたんに言えばdll hell(dll地獄,dependency hell)という事柄のようです.

dllを取ってくるフォルダの違いに気づかなかった私は,エラー自体の理解やらQt Creatorでのコンパイルし直しなどをいろいろ試します.
そこら辺のエラー内容などを全てまとめておくので,吸い寄せられるようにここにきて解決する人がいるといいなぁと思います.

まず,エラーについてです.
私にはプロシージャエントリポイントなんてわかりませんが,つまりは,
dll(今回は実行したexeファイルそのもの)内に_Z4endlR11QTextStreamなんて関数はないよ,dllに入ってるって君(実行者?)は言うけど入ってなかったよ
ということのようです.このエラー自体はとてもよく起きるようで,dll hellと強く関連します.

一例だけ,理解したレベルで紹介してみます.
dllはライブラリを動的にリンクするものです.dllに入っているような処理内容を実行ファイルごとに全て入れる必要がなくなり,省スペースであるという点が重要です.一軒家に家族人数分のトイレがあったら家は窮屈です.1つくらいのトイレをみんなが必要なときに参照するのがいいでしょう.地区に役所が個々人の人数分設立されていたらとてつもない無駄です.dllはそういうものだと簡単に理解しています.
そんなdllですが,例えば内部に間違い,プログラムで言えば欠陥が存在すれば,直して更新せざるを得ません.以前のdllのバージョンと互換性があればよいですが,互換性がなかった場合に問題がおきます.
古いdllで開発されたものが,新しいdllを参照してプログラムを動かし,互換性のない部分に触れた場合.よくてエラーして終了です.悪ければブルースクリーンやそれ以上にでもなるんじゃないでしょうか(そのくらいの感覚でdllを触ったほうがよいという意味です).

今回,dllを入れ替えただけで直ったんですが,なぜエラーの示したものがdllではなくexe実行ファイル本体だったのか,私には結局わかりませんでした.exeにということはdllでななくc,cppやhファイルかと思ったんですけどね…

次に,Qt Creatorでコンパイルし直してみると何が起きるのか,書き残します.
デバグ開始します.
実行失敗
During startup program exited with code 0xc0000139.
とポップします.
また,そんな状況で「実行」をしてみます(Qt Creatorの左タブ下の方のやつです).
アプリケーション出力に
C:\Users\~~~\(ファイル名).exe を起動中...
プログラムが突然終了しました。
C:\Users\~~~\(ファイル名).exe がクラッシュしました。
と出力されます.
なぜこうなるのだろう,という推測です.
dllを読み込むには環境変数を使っているでしょう.その優先順位が,Qt Creatorでの実行時,通常実行時とで共に現在のフォルダ(exeファイルのあるフォルダ)が初めの方にあるのだと考えてます.誰かチェックして.
持論を続けますと,Qt Creatorで実行するときには,ソフトが例えば
..\
C:\Qt\Qt5.6.2\5.6\mingw49_32\bin
C:\Qt\Qt5.6.2\Tools\QtCreator\bin
C:\Qt\Qt5.6.2\Tools\mingw492_32\bin
という優先順位でdllを探索してくれてるとか.そんでもって通常実行時にはC:\Qt\らへんのなんて参照してないとか.
だから通常実行時に「オイ.dllねえぞコノヤロウ」と言ってきて,私が間違って優先順位の低い方からdll引っ張ってきたばかりに,その後ではQt Creatorでも通常実行でも起動しなくなる(プロシージャエントリポイントのエラー)のではないか,と考えます.

実際,環境変数を調べてみるとシステムのも含めQtフォルダのものはありませんでした.
%SystemRoot%がどーのこーの言ってる海外のフォーラムもあったけれど…知らない…なにそれ.多分関係ないんじゃない?

持論を支えるにはもう2つくらいチェックする項目あるけど,誰かチェックして.
1.dllのバージョンチェック
2.Qt Creatorでコンパイル・実行時のdllやheader,cpp等を読み込む設定

力尽きた.参照したサイトが載っていないのは,今回ほんとにいろんなところを探索しすぎてきりがなかったから.
あ,ちなみにプロシッジャエントリポイットのエラーのときに,dllが足りないのでは??と考えて,dependency walkerというのも試しました.
exeファイルが参照するdllを読み込んでくれるソフトです.更新がされておらずAPI-WIN-??系だかなんだかを認識してくれないという問題はありますがそれはdependency walkerと共にネットですぐ知れます.それをチェックした上で,足りないものはなかったわけです.それでdllのバージョン違い,という問題に対処することを思いつきました.

dependency walkerの使い方のレクチャー(英語) How to generate Dependency Walker log files for Customer Support
Qt Creatorの使い方のレクチャー(英語) C++ Qt 84 - User Feedback how to deploy an application
両方共youtubeですが,見てません.そんな英語力まではないです.後者を見ることで解決したというフォーラム(こちら)は有りました.

この件,あまりにもフォーラムが少ない.日本語も英語も.なぜか勝手に直って捨ててるスレが数件あるというのも問題….
スポンサーサイト



プロフィール

satsuki

Author:satsuki
記事を消しつつ、ころころ変えながら運用中

最新記事
最新コメント
月別アーカイブ
カテゴリ
訪問者数
検索フォーム
リンク
QRコード
QR