リンカー ツールの警告 LNK4210
セクション section が存在します。静的初期化子、または終端記号がハンドルされていない可能性があります
解説
一部のコードでは静的初期化子または終端記号が導入されていますが、VCRuntime ライブラリ スタートアップ コードまたはそれと同等のもの (静的初期化子または終端記号を実行する必要があります) は、アプリケーションの起動時には実行されません。 静的初期化子または終端記号を必要とするコードの例を次に示します:
コンストラクター、デストラクター、または仮想関数テーブルを持つグローバル クラス変数。
コンパイル時以外の定数で初期化されたグローバル変数。
この問題を修正するには、次のいずれかの操作を行います:
静的初期化子を使用してすべてのコードを削除します。
/NOENTRY を使用しないでください。 /NOENTRY を削除した後、リンカーのコマンド ラインから /NODEFAULTLIB を 削除しなければならない場合もあります。
ビルドで /MT が使用されている場合は、リンカー コマンド ラインに libcmt.lib、libvcruntime .lib、libucrt を追加します。 ビルドで /MTd が使用されている場合は、libcmtd、vcruntimed .lib、libucrtd を追加します。
/clr:pure コンパイルを /clr に変更する場合は、リンカー行から /ENTRY オプションを削除します。 これにより、CRT の初期化が可能になり、アプリケーション起動時に静的初期化子を実行できるようになります。 /clr:pure コンパイラ オプションは Visual Studio 2015 では非推奨とされており、Visual Studio 2017 ではサポートされていません。
/GS コンパイラ オプションでは、__security_init_cookie
関数による初期化が必要です。 この初期化は、_DllMainCRTStartup
で実行される VCRuntime ライブラリ スタートアップ コードに既定で用意されています。
- プロジェクトが /ENTRY を使用してビルドされ、/ENTRY に
_DllMainCRTStartup
以外の関数が渡された場合、その関数は CRT を初期化するために_CRT_INIT
を呼び出す必要があります。 DLL で /GS が使用されている場合、静的初期化子が必要な場合、または MFC または ATL コードのコンテキストで呼び出された場合は、この呼び出しだけでは十分ではありません。 詳細は、DLL と Visual C++ ランタイム ライブラリの動作を参照してください。