VisualStudio(C++)でerror LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。

VisualStudio2013でC++コンソールアプリを作ってリンクしようとすると

error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。

が表示された。 プロジェクト設定を編集して、いろいろ設定を変えたのでおかしくなってしまったようだ。 そもそもC++のWindowアプリと、コンソールアプリケーションにはプロジェクト設定にどのような違いがあるのか調べてみた。

vc2013 設定

VisualStudio2013 C++ Windowアプリと、コンソールアプリの違い

プロジェクトファイルのDIFFを取って調べてみた。詳細はこちら。

C++ Windowアプリと、コンソールアプリのプロジェクトファイル違い WinMerge File Compare Report

プロジェクトファイルっていつの間にか.vcxproj形式に変わったのか…

  • C/C++>プリプロセッサ>プリプロセッサの定義にあたる箇所
<PreprocessorDefinitions>WIN32;_DEBUG;<strong>_WINDOWS</strong>;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;<strong>_CONSOLE;_LIB;%</strong>(PreprocessorDefinitions)</PreprocessorDefinitions>
  • リンカー>システム>サブシステムに当たる箇所

 <SubSystem><strong>Windows</strong></SubSystem>
 <SubSystem><strong>Console</strong></SubSystem>

VisualStudio2008 C++ Windowアプリと、コンソール違い

同様にVisualStudio2008でもWindowアプリとコンソールアプリのプロジェクトファイルのDIFFを調べてみた。 詳細はこちら。

VisualStudio2008 C++ Windowアプリと、コンソール違い WinMerge File Compare Report

  • 「C/C++>プリプロセッサ>プリプロセッサの定義」にあたる箇所

PreprocessorDefinitions="WIN32;_DEBUG;<strong>_WINDOWS</strong>"
PreprocessorDefinitions="WIN32;_DEBUG;<strong>_CONSOLE</strong>"                    

・「リンカー>システム>サブシステム」に当たる箇所

 SubSystem="<strong>2</strong>" ← Windowアプリ
 SubSystem="<strong>1</strong>" ← コンソールアプリ

プリプロセッサの定義が微妙に違うなぁ。_LIBってなんだろう。 ちなみに、
error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
は「C/C++>プリプロセッサ>プリプロセッサの定義」、「リンカー>システム>サブシステム」をコンソール用に設定したら正常にリンクされた。