11

最近、この警告が表示されました (VC++ 2010)

warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators

これがクリティカルセクションだと思います。オペレーティング システムのコースを受講してからしばらく経ちましたが、これが何を意味するのかよくわかりません。私の記憶が正しければ、クリティカル セクションは共有リソースで機能します。では、この警告はどのように関連しており、正確には何を意味するのでしょうか?

4

6 に答える 6

11

いいえ、CRT = C ランタイムです。プログラムが仕事を成し遂げるために必要とするのはサポートライブラリです。strcpy() のようなものがそこに住んでいます。プログラムの実行を開始する前に初期化する必要があるグローバル変数がコードに含まれている場合、.obj ファイルに「.CRT セクション」が作成されます。CRT がそれを処理します。

それは何も珍しいことではありません。問題は、CRT がプログラムにリンクされていることをリンカーが認識していないことです。初期化要件を除いて、CRT コードに依存しないコードを何らかの方法で記述しました。非常に奇妙で、この問題を抱えている人は聞いたことがありません。ドキュメントのチェックリストに従って、それらのいずれかがケースに一致するかどうかを確認してください。

于 2011-06-30T01:22:21.980 に答える
8

MSDNのドキュメントはこれをかなりうまくカバーしています:

一部のコードは静的初期化子またはターミネーターを導入しましたが、CRT またはそれに相当するもの (静的初期化子またはターミネーターを実行する必要があります) は、アプリケーションの起動時に実行されません。これを引き起こすコードの例:

  • コンストラクター、デストラクター、または仮想関数テーブルを持つグローバル クラス変数。
  • 非コンパイル時定数で初期化されたグローバル変数。

この問題を解決するには:

  • msvcrtxx.lib、libc.lib、libcd.lib、libcmt.lib、または libcmtd.lib をリンカ コマンド ラインに追加します。または、
  • 静的初期化子を含むすべてのコードを削除します。
  • /NOENTRY は使用しないでください。

したがって、静的スコープまたはグローバル スコープで作成されたオブジェクトが最近追加されていないか、コードをチェックします。何も見つからない場合は、リンクしているサードパーティのライブラリ内に隠れている可能性があります。いずれにせよ、最も可能性の高い解決策は、上記の「この問題を解決するには」セクションの最初の提案を使用して CRT とリンクすることです。

于 2011-06-30T01:19:56.357 に答える
2

DLL に「カスタム」エントリを手動で指定すると、同じ問題が発生しました。私はそのカスタム DLL エントリを削除し、単純にデフォルト名 DLLMain を使用していますが、再び動作します...奇妙です。

于 2014-03-04T18:51:44.497 に答える
-1

LIBCMT.LIB を使用して CRT 関連のものを初期化します.... エントリ関数に mainCRTStartup を使用し、_CRT_INIT を明示的に呼び出します。

link hello_world.obj Kernel32.lib UCRT.LIB legacy_stdio_definitions.lib LIBCMT.LIB /subsystem:console  /out:hello_world_basic.exe 
于 2021-08-11T23:56:46.220 に答える
-2
bits 64
default rel

segment .data
    msg db "Hello world!", 0xd, 0xa, 0

segment .text
global mainCRTStartup
extern ExitProcess
extern _CRT_INIT

extern printf

mainCRTStartup:
    push    rbp
    mov     rbp, rsp
    sub     rsp, 32

    call    _CRT_INIT

    lea     rcx, [msg]
    call    printf

    xor     rax, rax
    call    ExitProcess
    ret

を呼び出さない場合_CRT_INIT、リンカは「警告 LNK4210: .CRT セクションが存在します。未処理の静的イニシャライザまたはターミネータが存在する可能性があります」という警告を表示します。

于 2021-08-12T00:00:50.487 に答える