none
VS2017 v15.8.1 EXEファイルサイズが大きくなる

    質問

  • お世話になります。ご教授よろしくお願いいたします。

    下記の VC++ MFCアプリケーション・プロジェクト を新規作成します。

    アプリケーションの種類: ダイアログベース
    アプリケーションの種類のオプション: 全チェックなし
    ダイアログベースのオプション: 拡張MFCコントロールなし
    MFCの使用: スタティックライブラリでMFCを使用する
    メインフレームのスタイル: 全チェックなし
    高度な機能: 全チェックなし

    プロジェクトの主な構成プロパティは下記の通りです。

    ターゲットプラットフォームバージョン: 10.0.17134.0
    プラットフォーム ツールセット: Visual Studio 2017 (v141)

    生成されたヘッダーファイル<stdafx.h>内の #include "afxcontrolbars.h" を削除します。

    生成されたソースファイル<xxxxDlg.cpp>内の #include "afxdialogex.h" を削除します。

    (その他のソースやリソースは、一切変更しません)

    この構成でそのままリリース版をビルドすると、EXEファイルが以下のサイズとなります。
    x86版: 1,896Kバイト
    x64版: 2,519Kバイト

    ところが、「プラットフォーム ツールセット」を<Visual Studio 2015 (v140)>に変更してリビルドすると、EXEファイルが以下のサイズとなります。

    x86版: 354Kバイト
    x86版: 443Kバイト

    ちなみに、同様のプロジェクトを以前の「VS2017 v15.7.6」にてビルドすると、「プラットフォーム ツールセット」の設定に関わらず、x86版が350Kバイト、x64版が440Kバイト程度となり、1Mバイトを超えるようなことはありませんでした。

    従って、最新の「VS2017 v15.8.1」<Visual Studio 2017 (v141)>の構成でビルドしたとき、1Mバイトを超えるようなEXEファイルが作成されるようです。
    原因を調べた結果、「VS2017 v15.8.1」<Visual Studio 2017 (v141)>の構成では、「IMM32.LIB, WINMM.LIB, MSXML6.LIB」が余分にリンクされているようです。
    恐らく、リボンコントロール関係が付加されているのだと思われますが、<拡張MFCコントロールなし>のダイアログベース・アプリで且つ、生成されたソースをそのままビルドしておりますので、当然ながらリボンコントロールは不使用です。

    「VS2017 v15.8.1」においても、ツールセットを<Visual Studio 2015 (v140)>とすることで、前バージョン(v15.7.6)と同じ程度のファイルサイズが出来上がりますので、特に支障はないのですが、将来的なことを考えると、ツールセット<Visual Studio 2017 (v141)>の設定においても、これまでと同様なファイルサイズがビルドできるにこしたことはありません。

    そこで、「VS2017 v15.8.1」のツールセット<Visual Studio 2017 (v141)>の構成において、EXEファイルサイズを小さくするような手法がございましたら、お教え頂ければ幸いです。


    2018年8月22日 7:38

すべての返信

  • 私のところでも、再現しました。残念ながら回避方法は見つけられていないままですが、

    Developer Community に恐らく同様と思われる報告が上がっておりました。マイクロソフトの C++ チームに不具合として情報が届いているようですので、今後、修正されるのではないかと思います。

    https://developercommunity.visualstudio.com/content/problem/314928/mfc-static-application-too-big-with-afx-no-mfc-con.html

    2018年8月23日 1:10
  • 情報ありがとうございます。

    どうやら、修正版を待つしかないようですね。

    2018年8月23日 1:44
  • 本件と同じかはわかりませんが、同様の問題は度々発生していたと思います。ある時、MFCのソースコードを追いかけたところ、定義されているシンボルの1つが無関係なソースコードに含まれていて、それが原因で無関係なライブラリがリンクされていたような…。私はそれを報告しましたが、無理やり依存関係を切っただけで定義位置は修正されませんでした。

    # 探しましたがどこに報告したが見つけられませんでした。Connect?

    2018年8月23日 3:15
  • ご返信ありがとうございます。

    ご指摘の通り、過去のVSバージョンでも、本件と同じようにEXEファイルが1Mバイトを超えるようなことがありましたので、今回はソースファイルを究極まで単純化してみました。

    [Simple.cpp]

    #define VC_EXTRALEAN
    #define WINVER       0xa00
    #define _WIN32_WINNT 0xa00
    #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS
    #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS
    #define _AFX_ALL_WARNINGS
    #include <afxwin.h>
    class CSimpleApp : public CWinApp
    {
    };
    CSimpleApp theApp;

    ソースファイルは上記の1つのみで、リソースファイルや他にヘッダーファイルはありません。

    コンパイル・オプションでは、「プリコンパイル済みヘッダーを使用しない」とし、プリプロセッサの定義(/D)には、「WIN32, _WINDOWS, NDEBUG, _UNICODE, UNICODE」だけであることを確認しております。

    この単純化したプロジェクトにおいても、ツールセット<Visual Studio 2017 (v141)>でビルドすると、1Mバイトを超えるEXEファイルが出来上がってしまいます。

    (無論、ツールセット<Visual Studio 2015 (v140)>では、EXEファイルが1Mバイトを超えることはありません)

    次の改訂バージョンで改善されていることを祈るばかりです。

    2018年8月23日 4:59
  • 調査しました。

    MFCのソースコードdlgcore.cppのCWnd::CreateDlgIndirect()がAfxRegisterMFCCtrlClasses()を呼び出していることが原因でした。暫定的な回避策として、適当なcppファイルに以下を書き加えることで、実行ファイルサイズを削減できます。

    #if !defined(_AFXDLL) && defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS)
    void AfxRegisterMFCCtrlClasses() {}
    #endif

    P.S. 拙い英語で報告しますた。
    • 編集済み 佐祐理 2018年10月31日 14:06
    • 回答の候補に設定 kenjinoteMVP 2018年11月2日 12:35
    2018年10月31日 7:41
  • 15.9.1で解消する予定だそうです。Visual Studio 2017 15.9.0がリリースされましたがこちらでは改善されていませんでした。
    15 時間 17 分前