At compile time a C program usually consists of three kinds of components:
They contain definitions of constants or declarations of functions. Sometimes complete functions are implemented just as a macro, i.e. the code of the macro gets inserted whereever the macro is used. Header files collect information that is useful for more than one C source code file. To avoid duplicated informations with the associated maintenance problems this information is kept in central header files.
A C program can consist of one more more files with .c extension. Only one file can have a "main" function. The C files usually import ("include") header files with common declarations. There is no C rule for organizing the functions across files but usually related functions (e.g. those working on a common data structure or those forming a certain higher level function are kept together in one file which is called a module.
Libraries contain C function that are already compiled, so called object code. Most C programs do not implement everything they need by themselves. Instead, they use libraries like libsocket.a for network communication or libc.a the standard C library for input/output handling, string handling etc. C libraries are usually compatible across compilers. A special form of library are the above mentioned dynamic link libraries where at linktime only a stub for each function is linked to the program and the real function is accessed through this stub at runtime.