unresolved external symbols

1>entry.obj : error LNK2019: unresolved external symbol ___security_cookie referenced in function _wWinMain@16
1>entry.obj : error LNK2019: unresolved external symbol @__security_check_cookie@4 referenced in function _wWinMain@16
1>entry.obj : error LNK2019: unresolved external symbol @_RTC_CheckStackVars@8 referenced in function _wWinMain@16
1>entry.obj : error LNK2019: unresolved external symbol __RTC_CheckEsp referenced in function _wWinMain@16
1>entry.obj : error LNK2001: unresolved external symbol __RTC_Shutdown
1>entry.obj : error LNK2001: unresolved external symbol __RTC_InitBase
1>LINK : error LNK2001: unresolved external symbol _wWinMainCRTStartup

などとリンカに怒られ、これらがどのライブラリに定義されているかという疑問がわく。

答え: CRT (C Runtime Library; スレッディングによって異なるけれどたとえば LIBCMTD.lib)


リンカのスイッチ /VERBOSE をオンにし /NODEFAULTLIB をオフにして、リンクを成功させると、どのライブラリで見つかったか探索できる。

___security_cookie 関連は「バッファセキュリティチェック」を有効にしたときに、 __RTC_XXX は「ランタイムチェック」でスタックフレームと未初期化変数のそれぞれをチェックするよう設定したときにリンクされる。

そして CRT を使うため _wWinMainCRTStartup まで必要になるということか。セキュリティチェックのためには CRT が必要になる…って、なんだか納得しかねる。

とはいえ、これらシンボルは実行可能ファイルに直接リンクされるようで、実行時に CRT の Dll が必要になるわけではないみたい。