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 を使用するとこれを警告に変更できます。