GCC は未定義の参照についてエラーを出さないのでしょうか? 質問する

GCC は未定義の参照についてエラーを出さないのでしょうか? 質問する

GCCがどのような状況でない作成された関数を呼び出そうとすると、「未定義の参照」リンク エラー メッセージが表示されますか?

たとえば、次の C コードが GCC によってコンパイルおよびリンクされる状況:

void function()
{
    made_up_function_name();
    return;
}

made_up_function_name...存在しないにもかかわらずどこでもコード内(ヘッダー、ソース ファイル、宣言、サードパーティ ライブラリ内ではありません)。

そのようなコードは、実際のコードに触れることなく、特定の条件下で GCC によって受け入れられ、コンパイルされるのでしょうか? もしそうなら、どの条件でしょうか?

ありがとう。

編集: 以前の宣言や言及はmade_up_function_nameどこにも存在しません。つまり、grep -Rファイルシステム全体ののみまさにその 1 行のコードを表示します。

ベストアンサー1

--unresolved-symbolsはい、リンカー オプションを使用して、未定義の参照の報告を回避することは可能です。

g++ mm.cpp -Wl,--unresolved-symbols=ignore-in-object-files

からman ld

--未解決シンボル=メソッド

未解決のシンボルの処理方法を決定します。method には 4 つの値があります。

       ignore-all
           Do not report any unresolved symbols.

       report-all
           Report all unresolved symbols.  This is the default.

       ignore-in-object-files
           Report unresolved symbols that are contained in shared
           libraries, but ignore them if they come from regular object
           files.

       ignore-in-shared-libs
           Report unresolved symbols that come from regular object
           files, but ignore them if they come from shared libraries.  This
           can be useful when creating a dynamic binary and it is known
           that all the shared libraries that it should be referencing
           are included on the linker's command line.

共有ライブラリ自体の動作も、--[no-]allow-shlib-undefined オプションによって制御できます。

通常、リンカーは報告された未解決のシンボルごとにエラー メッセージを生成しますが、オプション --warn-unresolved-symbols を使用するとこれを警告に変更できます。

おすすめ記事