次の方法で共有


リンカー ツールの警告 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++ ランタイム ライブラリの動作を参照してください。

関連項目