Can GCC not complain about undefined references? Can GCC not complain about undefined references? c c

Can GCC not complain about undefined references?


Yes, it is possible to avoid reporting undefined references - using --unresolved-symbols linker option.

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

From man ld

--unresolved-symbols=method

Determine how to handle unresolved symbols. There are four possible values for method:

       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.

The behaviour for shared libraries on their own can also be controlled by the --[no-]allow-shlib-undefined option.

Normally the linker will generate an error message for each reported unresolved symbol but the option --warn-unresolved-symbols can change this to a warning.


TL;DR It can not complain, but you don't want that. Your code will crash if you force the linker to ignore the problem. It'd be counterproductive.

Your code relies on the ancient C (pre-C99) allowing functions to be implicitly declared at their point of use. Your code is semantically equivalent to the following code:

void function(){    int made_up_function_name(...); // The implicit declaration    made_up_function_name(); // Call the function    return;}

The linker rightfully complains that the object file that contains the compiled function() refers to a symbol that wasn't found anywhere else. You have to fix it by providing the implementation for made_up_function_name() or by removing the nonsensical call. That's all there's to it. No linker-fiddling involved.


If you declare the prototype of the function before using it , it shold compile. Anyway the error while linking will remain.

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