none
Visual Studio  Windows SDK プラットフォームツールセットの関係 RRS feed

  • 質問

  • Visual Studio と Windows SDK、またプラットフォーム ツールセットの関係性が理解できません。
    C++言語+MFCを利用してアプリケーションを開発しております。

    これまで、Windows7+VS2010(SP1)+SDK 7.1の開発環境で開発を行っておりました。
    新規PC+OSをWindows10に変更することになり、同じ開発環境を構築するためいろいろ勉強していたのですが。。。

    1.ただ、新しい環境では、VS2015もインストールすることになったので、VS2010をインストールする必要があるのかを悩んでいます。
    悩む理由はつぎの内容です。

    1-1. VS2015+SDK7.1をインストールし、プラットフォームツールセット(SDK7.1)することで、同じモジュールが構築されますか?
    1-2. 1.で作成した、C、MFC等のランタイムのバージョンはどうなるのでしょうか?
      ※インストーラに含めるVisual C++ 再頒布可能パッケージは?

    2.また、SDKのバージョンの質問もあるのですが、
    例えば、stdafx.hの_WIN32_WINNTの値を_WIN32_WINNT_WIN7 (0x0601)とすることで、
    最新のSDKのWindows 10 Version 1809 用 Windows 10 SDKを使用しても、Windows7以降を対象に指定くれるものなのでしょうか?

    つまり、VS2010+
    Windows 10 SDKでコンパイルした場合、Windows7+VS2010(SP1)+SDK 7.1と同じ内容のモジュールが生成されるのでしょうか?

    教えてください。

    2018年11月29日 6:43

回答

  • Visual StudioとWindows SDKの役割分担ですが、

    Windows SDKはWindowsに導入されているDLLにリンクできるようヘッダーファイルとライブラリファイルを提供します。_WIN32_WINNTを設定することで指定したバージョン以降で利用可能なライブラリだけに絞り込まれます。裏返すと指定したバージョンより後に提供された機能は無効化されます。

    Visual Studioはそれ以外の部分を提供します。具体的にはスタートアップルーチン(プロセスが起動されてからmain関数が呼ばれるまでの処理)、Cランタイムライブラリ(printfなど)、C++標準テンプレートライブラリ(std::vectorなど)、ATL、MFCなどです。これらをひとまとめにしたものがVisual C++ 再頒布可能パッケージとなっています。

    ですので、Windows SDKはどのバージョンを使用したところで、_WIN32_WINNT_WIN7を指定する限りWindows 7以降で使用可能なプログラムを生成できます。
    Visual Studioのバージョンを変更すると、Visual C++ 再頒布可能パッケージも変更する必要があります。これに関してはスタティックリンクすることでVisual C++ 再頒布可能パッケージに依存しないプログラムを生成することができます。

    蛇足ながら、Visual Studioは活発に開発・更新されています。可能な限り最新版を使用し、最新の機能を享受することをお勧めします。先述の通り、動作するWindowsバージョン部分はWindows SDK及び_WIN32_WINNT設定で切り替わるため、Visual Studio 2017の最新機能を使用していてもWindows XP向けプログラムを生成できます。

    • 回答としてマーク Brillia 2018年12月3日 4:08
    2018年11月29日 13:17
  • ちょっと違います。

    1. の、プラットフォームツールセットは、ビルドに利用する VC++コンパイラ(およびリンカー)のバージョンをさします。

    VS2008なら、v90, VS2010=v100, 2012=v110, 2013=v120, 2015=v140, 2017=v141 となっています。

    Windows SDK はある程度は選択できますが基本的にはそのVSに搭載されてるWindowsSDKを参照します。

    VS2010=7.0(A)、2012=8.0、2013=8.1、2015~=10(以後細かいビルドバージョン別)という感じです。

    SDKが選択できるのはVS2015以上となりますが、この選択は Windows 10 API をどのバージョン向けのセットを利用するか?という選択肢になります。こちらは、Windows 10 に対する対応の度合いによって変わるので、どういう形で取り組んでいるかでそれに応じた選択肢を選ぶということになります。

    特に積極的な対応はしていないという場合は好きなものを選べばいいです(佐祐理さんが書いている通り)。

    3. どのランタイムが必要か?ですが、こちらはプラットフォームツールセットに表示のあるVisual Studio版のVC++ランタイムとなります。

    _xp の有無でランタイムは変わりませんので、その手前のv141までの部分でどのバージョンを搭載するかが決まります。

    こちらは、VS上でプロパティを見てどれだ?とチェックすればわかりやすいと思います。

    対応バージョンの vcredist_x86(32bitアプリの場合)、vcredist_x64(64bitアプリの場合)を添付し、実行時にインストールします。

    一応書いておきますが、動作するOSが、32/64 のどちらかではなく、実行するアプリが 32/64 のどちらか?で選択となるので気を付けてください。

    あと、どのバージョンでも名前が一緒なので見た目だけではわからないという点も注意が必要かもしれません。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    • 回答としてマーク Brillia 2018年12月3日 4:08
    2018年11月30日 2:15

すべての返信

  • Visual Studio 2015 では、プロジェクトのプロパティから、プラットフォームのバージョンを選択できますので、そこで Visual Studio 2010 を選択した場合は、実行時必要となる MFC の VC++ ランタイムのバージョンは Visual Studio 2010 になり、Visual Studio 2010 でビルドしたときと同じモジュールが生成されると思います。(ここで設定したプラットフォームのバージョンが実行時に必要となる VC++ ランタイムのバージョンとなります。ただ MFC をスタティックライブラリで使う場合はこの限りではありません。)

    上記のようにプラットフォームツールセットで Visual Studio 2010 を選択するには、Visual Studio 2010 がシステムにインストールされている必要があったと思います。なので Visual Studio 2010 と 2015 を 2 つともインストールする必要があるかと思います。

    また、Windows 10 SDK を使った場合、Windows 7 以降を対象にしたモジュールを生成することが可能だと思います。ただ、最新版の Windows 10 Version 1809 用 Windows 10 SDK を使う場合は、Visual Studio 2017 が必要になると思われます。

    参考サイト:
    https://social.msdn.microsoft.com/Forums/en-US/0f11530a-d7a0-4c50-aeaa-094d054402b8
    https://developer.microsoft.com/ja-jp/windows/downloads/windows-10-sdk

    2018年11月29日 7:16
  • Visual StudioとWindows SDKの役割分担ですが、

    Windows SDKはWindowsに導入されているDLLにリンクできるようヘッダーファイルとライブラリファイルを提供します。_WIN32_WINNTを設定することで指定したバージョン以降で利用可能なライブラリだけに絞り込まれます。裏返すと指定したバージョンより後に提供された機能は無効化されます。

    Visual Studioはそれ以外の部分を提供します。具体的にはスタートアップルーチン(プロセスが起動されてからmain関数が呼ばれるまでの処理)、Cランタイムライブラリ(printfなど)、C++標準テンプレートライブラリ(std::vectorなど)、ATL、MFCなどです。これらをひとまとめにしたものがVisual C++ 再頒布可能パッケージとなっています。

    ですので、Windows SDKはどのバージョンを使用したところで、_WIN32_WINNT_WIN7を指定する限りWindows 7以降で使用可能なプログラムを生成できます。
    Visual Studioのバージョンを変更すると、Visual C++ 再頒布可能パッケージも変更する必要があります。これに関してはスタティックリンクすることでVisual C++ 再頒布可能パッケージに依存しないプログラムを生成することができます。

    蛇足ながら、Visual Studioは活発に開発・更新されています。可能な限り最新版を使用し、最新の機能を享受することをお勧めします。先述の通り、動作するWindowsバージョン部分はWindows SDK及び_WIN32_WINNT設定で切り替わるため、Visual Studio 2017の最新機能を使用していてもWindows XP向けプログラムを生成できます。

    • 回答としてマーク Brillia 2018年12月3日 4:08
    2018年11月29日 13:17
  • ご返事ありがとうございます。

    ・使用するVisual Studioのバージョンによって、Visual C++ 再頒布可能パッケージも異なる。

    使用するWindows SDKは、プラットフォームツールで切り替える
     Windows SDKは、対象OS+対象OS以前をサポートしている。

    _WIN32_WINNTの設定によって、対象プラットフォームが決定され、プラットフォームツールで設定したSDKから
    選別してコンパイル・リンク時に使用される。

    と理解しました。

    ただまだ理解できていない項目として、3つあるのですが、

    1.Visual Studioについている「vs100」,「vs120」などのツールセットも「Windows SDK」として認識していいのか?
     また、その場合、対象OSは明示されていますか?

    2.Visual Studio 2017で、
       XP向けのプログラムを構築するとき、
            [v141_XP] ,[
    _WIN32_WINNT=_WIN32_WINNT_WINXP ]

       Windows2000向けのプログラムを構築するとき、
            [
    v141],[_WIN32_WINNT=_WIN32_WINNT_WS03]

    3.「2.」ときのVisual C++ 再頒布可能パッケージは、VC++2017の再頒布可能パッケージを使用するということでいいのでしょうか?

    2018年11月30日 1:11
  • ちょっと違います。

    1. の、プラットフォームツールセットは、ビルドに利用する VC++コンパイラ(およびリンカー)のバージョンをさします。

    VS2008なら、v90, VS2010=v100, 2012=v110, 2013=v120, 2015=v140, 2017=v141 となっています。

    Windows SDK はある程度は選択できますが基本的にはそのVSに搭載されてるWindowsSDKを参照します。

    VS2010=7.0(A)、2012=8.0、2013=8.1、2015~=10(以後細かいビルドバージョン別)という感じです。

    SDKが選択できるのはVS2015以上となりますが、この選択は Windows 10 API をどのバージョン向けのセットを利用するか?という選択肢になります。こちらは、Windows 10 に対する対応の度合いによって変わるので、どういう形で取り組んでいるかでそれに応じた選択肢を選ぶということになります。

    特に積極的な対応はしていないという場合は好きなものを選べばいいです(佐祐理さんが書いている通り)。

    3. どのランタイムが必要か?ですが、こちらはプラットフォームツールセットに表示のあるVisual Studio版のVC++ランタイムとなります。

    _xp の有無でランタイムは変わりませんので、その手前のv141までの部分でどのバージョンを搭載するかが決まります。

    こちらは、VS上でプロパティを見てどれだ?とチェックすればわかりやすいと思います。

    対応バージョンの vcredist_x86(32bitアプリの場合)、vcredist_x64(64bitアプリの場合)を添付し、実行時にインストールします。

    一応書いておきますが、動作するOSが、32/64 のどちらかではなく、実行するアプリが 32/64 のどちらか?で選択となるので気を付けてください。

    あと、どのバージョンでも名前が一緒なので見た目だけではわからないという点も注意が必要かもしれません。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    • 回答としてマーク Brillia 2018年12月3日 4:08
    2018年11月30日 2:15
  • しかし、VS2010開発中のアプリでは、プラットフォームツールセットを、「Windows7.1SDK」を選択しています。
    これはSDKを選択していることになっているのではと理解していました。。。
    どう理解したらよいのでしょうか。

    また、複数のバージョンのSDKをインストールしていた場合、VS2015では、切り替えができることは理解できましたが、
    例えば、VS2013では、どのようにSDKを選択していたのでしょうか?

    2018年11月30日 3:35
  • Windows SDKを選択する意義がほとんどありません。Visual Studioに同梱されているWindows SDKよりも新しいバージョン、その機能を利用したい場合に切り替えが必要になります。投稿内容を読む限りでは、質問者さんはそのような状況ではなさそうに聞こえます。

    なお、Windows 2000向けプログラムの生成を公式にサポートしているのはVisual Studio 2008までです。2010以降になるとxp以降にしか対応していません。ついでに2019以降はxp / 2003も対象外となります。

    2018年11月30日 3:53
  • 7.1は独立SDKを入れていませんか?

    > Windows SDK はある程度は選択できますが基本的にはそのVSに搭載されてる

    と、書いたようにある程度選択ができます。それが「独立SDKのインストール時に選択」という作業になります。

    気づいてないか忘れているだけで特定のVSに設定が反映されるようにするチェックを入れてるはずなんですが。。。

    VS2013でも、インストールしてるSDKによってはデフォルト設定とは異なる場合もあると思います(私の環境はいじってないので、2013は、8.1が参照されています)。

    プロジェクトごとの参照情報は、プロジェクトのプロパティから、VC++ディレクトリで、INCLUDEやLIBが何を指しているかを参照することで、確認ができます。

    各マシンの標準設定は、オプション設定の「プロジェクト及びソリューション」にある注意書きからたどっていくことで確認ができます(多分今でもリファレンスはあると思う)。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2018年11月30日 5:08