Although this question has an accepted answer, I would like to put some more insights into the problem and clear some more doubts :-
According to c99 standard (§6.2.2 #3)
If the declaration of a file scope identifier for an object or a
function contains the storage class specifier static, the
identifier has internal linkage.
A function with internal linkage is only visible inside one translation unit.
The linker never hears about those functions with internal linkage, so it knows nothing about them. In short the functions or variables with internal linkages are invisible to the linker. By now , you must have understood why we must include the header files.
Don't forget to check the c standard documentation .