1

Qt 5.0.2 が提供する MinGW-builds ツールチェーンを使用してプロジェクトをビルドしています。全体としては順調に進んでいますが、問題が発生したようです。ベータ テスターが自分の Windows XP マシンでプログラムを実行すると、プログラムは即座に次のエラーでクラッシュします。

XP クラッシュ ダイアログ

Dependency Walkerを使って調べてみたところ、次の 2 つのことがわかりました。

  1. MinGW の C++ ランタイムがそれにリンクすると、msvcrt.dll が関与します。
    リンクトレイル

  2. 驚くべきことに、彼のコンピューター (およびオフィス内の他のいくつかのコンピューター) には msvcrt.dll (Windows C ランタイム ライブラリ) のバージョンが非常に古いため、「安全な」CRT 追加(MinGW の C++ ランタイムが使用しているようです) がすべて欠けています。

Qt が (で) 提供する Visual C++ ランタイムをインストールしQt\Qt5.0.2\vcredistても問題は解決しません。Qt が使用するものなどの最新バージョンのランタイムでは、古いファイルを置き換える代わりに、別のファイル (VS11 の msvcp110.dll や msvcr110.dll など) が提供されるためです。 1。

回避策はありますか?MinGW のすべてのバージョンがこのファイルにリンクしているように見えますが、C++11 のサポートが不十分なため、Visual Studio 2010 (Qt 5 が提供する別のオプション) に切り替えないことを本当に望んでいます。最初のアイデアは、インストーラーに古い msvcrt.dll を新しいものに置き換えることですが、

  1. 多くのプログラムがランタイムを積極的に使用しているため (想像してみてください)、単純に上書きすることはできません。

  2. 厄介なユーザー空間アプリケーションのインストーラーがC:\Windows\System32ファイルにアクセスして置き換えを開始するのは、非常に悪いことのように思えます。

4

1 に答える 1

3

libstdc++-6.dllビルド済みの Qt 5.0.2 (MinGW を使用) パッケージと共にインストールされるのコピー( ) は、からqt-windows-opensource-5.0.2-mingw47_32-x86-offline.exeインポートされません。memmove_smsvcrt.dll

libstdc++-6.dllQt 5.0.2 with MinGW パッケージによってインストールされたさまざまなバージョンから、名前に「memmove」が含まれるすべてのインポートのダンプを次に示します。

C:\qt\5.0.2>for /f "usebackq" %a in (`dir libstdc++-6.dll /s/b`) do dumpbin /imports %a | grep memmove

C:\qt\5.0.2>dumpbin /imports C:\qt\5.0.2\5.0.2\mingw47_32\bin\libstdc++-6.dll | grep memmove
                  418 memmove

C:\qt\5.0.2>dumpbin /imports C:\qt\5.0.2\Tools\MinGW\bin\libstdc++-6.dll   | grep memmove
                  418 memmove

C:\qt\5.0.2>dumpbin /imports C:\qt\5.0.2\Tools\MinGW\i686-w64-mingw32\lib\libstdc++-6.dll   | grep memmove
                  418 memmove

C:\qt\5.0.2>dumpbin /imports C:\qt\5.0.2\Tools\MinGW\i686-w64-mingw32\lib64\libstdc++-6.dll   | grep memmove
                         402 memmove

表示のインポートはありませんmemmove_s

あなたのスクリーンショットは、直接appmanager.exe依存していることも示しているようです。msvcrt.dllおそらく、それが依存関係のmemmove_s由来ですか?次のコマンドを実行してみてください。

dumpbin /imports appmanager.exe | grep memmove

(ダンプビンを取得するにはMSツールチェーンが必要です。これは単なるラッパーです。便利に処理link /dumpできませんでした)。objdumplibstdc++-6.dll

于 2013-06-15T08:53:57.073 に答える