Challenge 2: Omitting math_utils.o From the Link Command — Possible Solution ==================================================================== $ gcc -c main.c -o main.o $ gcc main.o -o program Error: /usr/bin/ld: main.o: in function `main': main.c:(.text+0x15): undefined reference to `add' collect2: error: ld returned 1 exit status Explanation: main.c compiled successfully into main.o without any error at all -- the compiler only needed math_utils.h's DECLARATION of add to accept the call add(2, 3) as valid syntax with the correct signature. The problem only surfaces at the LINKING step: main.o contains a call to a function named add with no actual body attached to it (an unresolved external symbol), and since math_utils.o -- the only object file that contains add's real DEFINITION -- was never included in the final gcc command, the linker has nothing to match that call against. It reports "undefined reference to `add'" because it can find a reference (the call) but no corresponding definition anywhere in the files it was given. WHY THIS WORKS AS AN ANSWER ------------------------------ This shows the exact error message, correctly identifies it as a LINKER error rather than a compile error (compilation of main.c succeeded on its own), and explains precisely why the header alone was enough for compilation to succeed while the missing object file caused linking specifically to fail -- exactly the declaration-vs-definition distinction the chapter's tip-box describes.